用于控制文件描述符的函数:fcntl
函数
fcntl
函数
函数描述: 对打开的文件描述符进行控制,如获取或修改打开文件的状态标志(对应open函数的flags参数)
函数原型: int fcntl(int fd, int cmd,... l* arg */ );
函数参数:
fd
:要控制的文件描述符
cmd
:不同值对应不同的操作
cmd
为F_GETFL
:获取文件描述符的flag值
cmd
为F_SETFL
:设置文件描述符的flag值
cmd
为F_DUPFD
:复制文件描述符,与dup
函数功能相同
函数返回值:返回值取决于cmd
●成功
●若cmd
为F_DUPFD
,返回一个新的文件描述符
●若cmd
为F_GETFL
,返回文件描述符的 flags值
●若cmd
为F_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_APPEND
、O_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);