#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; }