fcntl 获取文件状态标志

int fcntl(int fd,int cmd,...)

  函数fcntl提供了非常丰富的功能。主要依赖于cmd的各种参数:

  1. 复制已有的文件描述符 F_DUPFD,F_DUPFD_CLOEXEC
  2. 获取设置文件描述符的标志 F_GETFD,F_SETFD
  3. 获取设置文件状态标志 F_GETFL,F_SETFL
  4. 获取设置异步IO的所有权 F_GETOWN,F_SETFL
  5. 获取设置记录锁 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
");
19             break;
20         case O_WRONLY:
21             printf("O_WRONLY
");
22             break;
23         case O_RDWR:
24             printf("O_RDWR
");
25             break;
26     }
27 
28     if(fl & O_APPEND)
29         printf("O_APPEND
");
30     if(fl & O_NONBLOCK)
31         printf("O_NONBLOCK
");
32     if(fl & O_SYNC)
33         printf("O_SYNC
");
34     if(fl & O_FSYNC)
35         printf("O_FSYNC
");
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。

原文地址:https://www.cnblogs.com/ittinybird/p/4461487.html