#include <fcntl.h> int fcntl(int fd, int cmd, ...)
dup(fd) <===> fcntl(fd, F_DUPFD, 0)
dup2(fd1, fd2) <===> close(fd2); fcntl(fd1, F_DUPFD, fd2)
得到/设置文件描述符标记(cmd = F_GETFD 或者 F_SETFD)
F_GETFD 对应于fd的文件描述符标志做为函数返回值
F_SETFD 给fd设置文件描述符,新标志值按第三个参数设置ios
得到/设置文件状态标志(cmd = F_GETFL 或者 F_SETFL)
Note: F_GETFL:文件状态标志做为返回值
O_RDONLY ------> 只读
O_WRONLY ------> 只写
O_RDWR ------> 为读写打开
O_APPEND ------> 每次写时追加
O_NONBLOK------> 非阻塞模式
O_SYNC ------> 等待写完成(数据和属性)
O_DSYNC ------> 等待写完成(仅数据)
O_RSYNC ------> 读写同步
NOTE: O_RDONLY,O_WRONLY,O_RDWR三种标志并不各占一位,因为历史缘由这三种值互斥,一个文件只能有这三个值之一.所以必须用屏蔽字O_ACCOMDE取得访问模式位,而后将结果与这三个值中任意一个比较.app
得到/设置记录锁(cmd = F_GETLK, F_SETLK 或者 F_SETLKW)异步
#include <iostream> #include <fcntl.h> #include <stdlib.h> using namespace std; int main(int argc, char** argv) { if (argc != 2) { cout << "Usage error" << endl; return -1; } cout << "argv[0]:" << argv[0] << " argv[1]:" << argv[1] << endl; int val = 0; //O_RDONLY 00 //O_WRONLY 01 //O_RDWR 02 //三种标志并不各站 if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) { cout << "fcntl getfl error" << endl; return -1; } switch (val & O_ACCMODE) { //取得访问标志位. case O_RDONLY: cout << "read only" << endl; break; case O_WRONLY: cout << "write only" << endl; break; case O_RDWR: cout << "read write" << endl; break; default: cout << "unkown access mode" << endl; } if (val & O_APPEND) { cout << ", append" << endl; } if (val & O_NONBLOCK) { cout << ", nonblock" << endl; } return 0; }