前言
当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志。
解决思路
1. 对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状态标志常量进行&操作。若操作结果为正则文件具有此状态标志,否则文件没有此状态标志。( 如果是检查只读,只写,可读可写,则需要和ACCMODE相&,然后判断其结果是否为O_RDONLY,O_WRONLY,O_RDWR )。
2. 对于增加文件状态标志,我们可以先调用fcntl函数得到一个记录文件标志的整型变量,然后让它 |= 你想为其增设的状态标志,最后再调用fcntl函数保存这个标志。
3. 对于删除文件状态标志,我们可以先调用fcntl函数得到一个记录文件标志的整型变量,然后让它 &= 你想为其增设的状态标志的~,最后再调用fcntl函数保存这个标志。
PS:调用fcntl函数需要包含 fcntl.h 头文件
示例代码 - 获取文件的状态标志
1 #include "apue.h" 2 #include <fcntl.h> 3 4 int 5 main(int argc, char *argv[]) 6 { 7 int val; 8 9 // 以文件标志符作参数 10 if (argc != 2) 11 err_quit("usage: a.out <descriptor#>"); 12 13 // 将字符串类型的文件标志符转换成整型 14 if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) 15 err_sys("fcntl error for fd %d", atoi(argv[1])); 16 17 /* 18 * 下段代码检测标识符对应文件的读写属性 19 */ 20 switch (val & O_ACCMODE) { 21 case O_RDONLY: 22 printf("read only"); 23 break; 24 25 case O_WRONLY: 26 printf("write only"); 27 break; 28 29 case O_RDWR: 30 printf("read write"); 31 break; 32 33 default: 34 err_dump("unknown access mode"); 35 } 36 37 /* 38 * 下段代码检测标识符对应文件的其他属性 39 */ 40 if (val & O_APPEND) 41 printf(", append"); 42 if (val & O_NONBLOCK) 43 printf(", nonblocking"); 44 45 // 对于定义了O_SYNC标志的系统检测该标志 46 #if defined(O_SYNC) 47 if (val & O_SYNC) 48 printf(", synchronous writes"); 49 #endif 50 #if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) 51 if (val & O_FSYNC) 52 printf(", synchronous writes"); 53 #endif 54 putchar(' '); 55 exit(0); 56 }
示例代码 - 增加文件的状态标志
1 #include "apue.h" 2 #include <fcntl.h> 3 4 void 5 set_fl(int fd, int flags) 6 { 7 int val; 8 9 // 获取记录状态标志的整型变量 10 if ((val = fcntl(fd, F_GETFL, 0)) < 0) 11 err_sys("fcntl F_GETFL error"); 12 13 // 增加状态标志 14 val |= flags; 15 16 // 保存状态标志 17 if (fcntl(fd, F_SETFL, val) < 0) 18 err_sys("fcntl F_SETFL error"); 19 }
示例代码 - 删除文件的状态标志
1 #include "apue.h" 2 #include <fcntl.h> 3 4 void 5 set_fl(int fd, int flags) 6 { 7 int val; 8 9 // 获取记录状态标志的整型变量 10 if ((val = fcntl(fd, F_GETFL, 0)) < 0) 11 err_sys("fcntl F_GETFL error"); 12 13 // 删除状态标志 14 val &= ~flags; 15 16 // 保存状态标志 17 if (fcntl(fd, F_SETFL, val) < 0) 18 err_sys("fcntl F_SETFL error"); 19 }
说明
fcntl函数的功能远不及此,其他的功能会随着学习的深入再做讲解。