Unix高級環境編程之fcntl函數

#include <fcntl.h>
int fcntl(int fd, int cmd, ...)

fcntl功能

  1. 複製一個現有的描述符 (cmd = F_DUPFD) ##### 返回值:新文件描述符, __新描述符__和fd共享同一文件表項
dup(fd) <===> fcntl(fd, F_DUPFD, 0)
dup2(fd1, fd2) 
<===>
close(fd2);
fcntl(fd1, F_DUPFD, fd2)
  1. 得到/設置文件描述符標記(cmd = F_GETFD 或者 F_SETFD)
    F_GETFD 對應於fd的文件描述符標誌做爲函數返回值
    F_SETFD 給fd設置文件描述符,新標誌值按第三個參數設置ios

  2. 得到/設置文件狀態標誌(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

  3. 得到/設置異步IO全部權(cmd = F_GETDOWN 或者 F_SETDOWN)
  4. 得到/設置記錄鎖(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;
}
相關文章
相關標籤/搜索