码迷,mamicode.com
首页 > 其他好文 > 详细

fcntl 获取文件状态标志

时间:2015-04-27 23:04:17      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

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\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,结果说明了O_ACCMODE可行。

fcntl 获取文件状态标志

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!