int fcntl(int fd,int cmd,...)
函数fcntl提供了非常丰富的功能。主要依赖于cmd的各种参数:
- 复制已有的文件描述符 F_DUPFD,F_DUPFD_CLOEXEC
- 获取设置文件描述符的标志 F_GETFD,F_SETFD
- 获取设置文件状态标志 F_GETFL,F_SETFL
- 获取设置异步IO的所有权 F_GETOWN,F_SETFL
- 获取设置记录锁 F_GETLK,F_SETLK,F_SETLKW
当cmd= F_GETFL时,fcntl的功能就是获取fd的文件状态的标志。和其他地方不同的是,这个返回的数值并不是每种标志各占二进制的一位。因为O_RDONLY,O_WRONLY,
O_RDWR是互斥的状态。在处理返回值时,使用O_ACCMODE宏可以将fd文件的读写状态取出来。
将O_RDONLY,O_WRONLY,O_RDWR,O_ACCMODE打印出来分别0,1,2,3,用3去位于0,1,2结果很明显。
DEMO:
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h> int main(int argc,char** argv)
{
if(argc != )
return -;
int fl =;
if((fl = fcntl(atoi(argv[]),F_GETFL)) < ) {
printf("getfl failed.");
exit(-);
} switch (fl & O_ACCMODE) {
case O_RDONLY:
printf("O_RDONLY\n");
break;
case O_WRONLY:
printf("O_WRONLY\n");
break;
case O_RDWR:
printf("O_RDWR\n");
break;
} if(fl & O_APPEND)
printf("O_APPEND\n");
if(fl & O_NONBLOCK)
printf("O_NONBLOCK\n");
if(fl & O_SYNC)
printf("O_SYNC\n");
if(fl & O_FSYNC)
printf("O_FSYNC\n"); }
结果:
$a.out < .c O_RDONLY $a.out >.c $cat .c O_WRONLY $a.out >>.c $cat .c O_WRONLY O_APPEND $a.out <>.c O_RDWR
上边使用重定向,0,1分别别重定向到文件。于是对fd GETFL就是对这个文件GETFL。