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:
1 #include <unistd.h> 2 #include <fcntl.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 6 int main(int argc,char** argv) 7 { 8 if(argc != 2) 9 return -1; 10 int fl =0; 11 if((fl = fcntl(atoi(argv[1]),F_GETFL)) < 0) { 12 printf("getfl failed."); 13 exit(-1); 14 } 15 16 switch (fl & O_ACCMODE) { 17 case O_RDONLY: 18 printf("O_RDONLY\n"); 19 break; 20 case O_WRONLY: 21 printf("O_WRONLY\n"); 22 break; 23 case O_RDWR: 24 printf("O_RDWR\n"); 25 break; 26 } 27 28 if(fl & O_APPEND) 29 printf("O_APPEND\n"); 30 if(fl & O_NONBLOCK) 31 printf("O_NONBLOCK\n"); 32 if(fl & O_SYNC) 33 printf("O_SYNC\n"); 34 if(fl & O_FSYNC) 35 printf("O_FSYNC\n"); 36 37 }
结果:
$a.out 0 < 1.c O_RDONLY $a.out 1>1.c $cat 1.c O_WRONLY $a.out 1 1>>1.c $cat 1.c O_WRONLY O_APPEND $a.out 2 2<>1.c O_RDWR
上边使用重定向,0,1分别别重定向到文件。于是对fd GETFL就是对这个文件GETFL。