【Linux系统编程】fcntl函数

 用于控制文件描述符的函数:fcntl函数

fcntl函数

函数描述:  对打开的文件描述符进行控制,如获取或修改打开文件的状态标志(对应open函数的flags参数)

函数原型: int fcntl(int fd, int cmd,... l* arg */ );

函数参数:

fd:要控制的文件描述符

cmd:不同值对应不同的操作

  cmdF_GETFL:获取文件描述符的flag值

  cmdF_SETFL:设置文件描述符的flag值

  cmdF_DUPFD:复制文件描述符,与dup函数功能相同

函数返回值:返回值取决于cmd

●成功

●若cmdF_DUPFD,返回一个新的文件描述符

●若cmdF_GETFL,返回文件描述符的 flags值

●若cmdF_SETFL,返回0

●失败返回-1,并设置errno

fcntl函数常用的操作:

●获取文件的属性标志 ​ int flags = fcntl(fd,F_GETFL);

#include<stdio.h>  
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>

int main(int argc, char* argv[])
{
    int fd = open("a.txt", O_RDWR | O_NONBLOCK);//设置非阻塞
    int flags = fcntl(fd, F_GETFL);
    if(flags & O_NONBLOCK) {//包含
        printf("flags include O_NONBLOCK\n");
    }
    if(flags & O_RDWR) {//包含
        printf("flags include O_RDWR\n");
    }
    if(flags & O_RDONLY) {//不包含
        printf("flags include O_RDONLY\n");
    }
    printf("flags = %d\n", flags);
    return 0;
}

包含它也打不出来,因为它是0

#include<stdio.h>  
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>

int main(int argc, char* argv[])
{
    int fd = open("a.txt", O_RDONLY | O_NONBLOCK);//设置非阻塞
    int flags = fcntl(fd, F_GETFL);
    if(flags & O_NONBLOCK) {//包含
        printf("flags include O_NONBLOCK\n");
    }
    if((flags & O_ACCMODE) == O_RDONLY) {//包含
        printf("flags include O_RDONLY\n");
    }
    printf("flags = %d\n", flags);
    return 0;
}

让它(flags & O_ACCMODE) == O_RDONLY就能打出来了

一个八进制的0是三个二进制的0

●修改文件状态标志(只允许修改某些标志如:O_APPENDO_NONBLOCK)

flag = flag | o_NONBLOCK;

ofcntl(fd,F_SETFL, flag);

#include<stdio.h>  
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>

int main(int argc, char* argv[])
{
    int fd = open("a.txt", O_RDONLY);//设置非阻塞
    int flags = fcntl(fd, F_GETFL);
    flags |= O_NONBLOCK;
    fcntl(fd, F_SETFL,flags);
    if(flags & O_NONBLOCK) {//不包含
        printf("flags include O_NONBLOCK\n");
    }
    if((flags & O_ACCMODE) == O_RDONLY) {//包含
        printf("flags include O_RDONLY\n");
    }
    printf("flags = %d\n", flags);
    return 0;
}

●复制文件描述符,使用大于等于startfd的最小未用值作为新的文件描述符

int newfd = fcntl(fd,F_DUPFD, startfd);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值