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设置文件描述符,新标志值按第三个参数设置

  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取得访问模式位,然后将结果与这三个值中任意一个比较.

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

转载于:https://www.cnblogs.com/457220157-FTD/p/5331023.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值