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;
}
相关文章
相关标签/搜索