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

穆晨 穆晨     2022-08-21     137

关键词:

前言

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

cobaltstrike使用-第七篇(获取信任凭证哈希认证kerberos票据横向移动)(代码片段)

文章目录获取信任->登录认证登录令牌凭证哈希认证Kerberos票据黄金票据横向移动基本步骤1.创建可执行文件2.上传可执行文件3.1执行文件-方法13.2执行文件-方法23.3执行文件-方法3获取信任->登录认证如果当前账号权限被系统... 查看详情

fcntl函数理解问题

...设置文件状态标识吗,那么我以只读方式打开一个文件,使用fcntl将文件状态标识设置为可写,为什么不能写入文件呢?argv[1]为文件路径,文件权限为可读写控制台输出fd=3num=-1参考技术A估计fcntl返回失败-1,O_WRONLY|O_TRUNC不能更... 查看详情

linux编程问题fcntl函数

...万分感谢……我想问的是这两句语言的具体意思不是fcntl函数的用法谢谢fcntl的返回值与命令有关。如果出错,所有命令都返回-1,如果成功则返回某个其他值。下列三个命令有特定返回值:F_DUPFD,F_GETFD,F_GETFL以及F_GETOWN。第一个... 查看详情

第七篇pythonio操作

文章目录10文件操作10.1打开与关闭10.1.1打开文件10.1.2关闭文件10.2文件的读写10.2.1写数据(write)10.2.2读数据(read)10.2.3读数据(readlines)10.2.4读数据(readline)10.3文件的常用操作10.3.1获取当前读写的位置10.3.2定位到某个位置10.3.3文件... 查看详情

第七篇pythonio操作

文章目录10文件操作10.1打开与关闭10.1.1打开文件10.1.2关闭文件10.2文件的读写10.2.1写数据(write)10.2.2读数据(read)10.2.3读数据(readlines)10.2.4读数据(readline)10.3文件的常用操作10.3.1获取当前读写的位置10.3.2定位到某个位置10.3.3文件... 查看详情

第七篇camunda系列-身份服务(代码片段)

身份服务  在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或... 查看详情

第七篇:两个经典的文件io程序示例

前言    本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅。程序功能  程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据。程序一代码及其注释1#... 查看详情

第九篇:使用lstat函数获取文件信息

...置,设备编号,访问时间等等。如果要获取这些信息,则使用函数 lstat 可以轻松达到这个目的。    下面的程序将使用该函数获取文件类型信息并判断它的类型。  &nb 查看详情

go语言第七篇:go函数

Go语言函数函数是基本的代码块,用于执行某个任务。Go语言最少有个main()函数,可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称,返回类型和参数。Go语言标准库提供了多... 查看详情

cobaltstrike使用-第七篇(获取信任凭证哈希认证kerberos票据横向移动)(代码片段)

文章目录获取信任->登录认证登录令牌凭证哈希认证Kerberos票据黄金票据横向移动基本步骤1.创建可执行文件2.上传可执行文件3.1执行文件-方法13.2执行文件-方法23.3执行文件-方法3获取信任->登录认证如果当前账号权限被系统... 查看详情

第七篇函数二

一、冒泡排序li=[15,14,13,12,11]"""这里是外面套循环轮数,内部循环拿到一个最大值记住,range的循环不带最后一个里面循环是拿到一个最大值,然后外面是循环多少轮那就把最大值拿出来了"""‘‘‘forninrange(1,len(li)):forminrange(len(li)... 查看详情

第七篇:面向对象高级

第七篇:面向对象高级   PYTHON-绑定方法反射内置函数PYTHON-组合封装多态property装饰器 查看详情

android基础第七篇

转载请标明出处:http://blog.csdn.net/gj782128729/article/details/52424876;本文出自:【高境的博客】1.清单文件AndroidManifest.xml1.1.清单文件的作用每个Android应用都需要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名是固定的并且... 查看详情

混合编程jni第七篇之jni的命令行们(代码片段)

        今天将继续JNI的学习,jni编程中常使用的一些命令行工具如何使用事半功倍,今天就快速的过一下,希望在接下来的使用中可以发挥效果    javahjavah是Java提供的生成jni头文件的... 查看详情

测开之函数进阶篇・第七篇《装饰器》(代码片段)

目录装饰器开放封闭原则装饰器的作用装饰器的应用场景实现一个装饰器装饰器原理阐述带参数的装饰器装饰器装饰类定义一个时间装饰器装饰器开放封闭原则软件实体应该是可扩展、而不可修改的。也就是说,对扩展是开... 查看详情

powerbi开发第七篇:数据集和数据刷新

PowerBI报表是基于数据分析的引擎,数据真正的来源(DataSource)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样。PowerBIService(云端)有时不直接访问DataSource,而是直接从PowerBIService创建的数据集(Dataset)中获... 查看详情

第七篇camunda系列-身份服务(代码片段)

身份服务  在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多... 查看详情

第七篇使用uiview的animatewithduration方法制作简易动画

 importUIKitclassLolitaCircleButton:UIButton{privatevarcolor:UIColorprivatevarimageURL:Stringinit(color:UIColor,imageURL:String){self.color=colorself.imageURL=imageURLsuper.init(frame:CGRectZero) 查看详情