使用 fcntl 函数 获取,设置文件的状态标志

前言

  当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 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函数的功能远不及此,其他的功能会随着学习的深入再做讲解。

原文地址:https://www.cnblogs.com/scut-fm/p/3375177.html