前言

  当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 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('\n');
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

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

  1. C语言rewind()函数(设置文件位置为给定流 stream 的文件的开头)(回到文件开头重读)

    C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 描述 C 库函数 void rewind(FILE *stream) 设置文件位置为给定流 stream 的文 ...

  2. 使用jquery中的getJSON函数获取json文件中的内容并输出到页面上和使用 AJAX处理JSON文件

    html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. Linux fcntl 函数详解

    接口 #include <fcntl.h>int fcntl(int fd, int cmd, ...); 返回值: 正确返回值根据命令码而定,错误返回-1. fcntl是用来修改已经打开 ...

  4. fcntl函数 和 ioctl函数

    文章目录 一.fcntl 函数 二.ioctl 函数 一.fcntl 函数 fcntl()函数可以对一个已经打开的文件描述符执行一系列控制操作,譬如复制一个文件描述符(与dup.dup2 作用相同). ...

  5. Unix/Linux编程:fcntl函数总结

    fcntl VS ioctl fcntl函数,也就是file control,提供了对文件描述符的各种操作.另一个常见的控制文件描述符的属性和行为的系统调用是ioctl,而且ioctl比fcntl能够 ...

  6. fcntl函数-文件控制函数

    今日命令在vim中使用:vsplit ./include/io.h 是以垂直方式打开io.h文件 同理:split ./include/io.h 是以水平方式打开io.h文件 可以用fcntl 函数改 ...

  7. C文件操作——设置文件的位置指示器fseek函数(一般用于二进制文件)

    文章目录: 一:语法 二:参数 三:返回值 四:举例 fseek 函数用于设置文件流的位置指示器 一:语法 #include <stdio.h> ... int fseek(FILE *s ...

  8. (整理类)文件描述符,文件描述符标志,文件状态标志

    感谢和参考于(你们是我成长路上的最大助力!): Linux中文件描述符fd和文件指针flip的理解 文件描述符标志.文件状态标志 Linux编程–文件描述符fd PART 1 文件描述符:fd(fil ...

  9. sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数

    第一个函数:使用 sigaction函数: signal 函数的使用方法简单,但并不属于POSIX标准,在各类UNIX平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX标准定义的信号处 ...

最新文章

  1. python求数列的积_python小游戏学习笔记4-2(列表【】,数列矩阵排列)
  2. golang中package的4种导入方式
  3. ajax获取json里的list,ajax获取json数据然后将其装载到jqgrid实现
  4. Android 字母导航条实现
  5. 【Unity】 2D贪吃豆开发流程
  6. [转] A trip through the Graphics Pipeline
  7. 9 行 javascript 代码获取 QQ 群成员
  8. ESP8266-Arduino编程实例-TTP223 电容式触摸传感器驱动
  9. VC++6.0安装、编译NTL类库
  10. 强网杯2022 pwn 赛题解析——yakacmp
  11. 一元多项式的除法C++实现
  12. 在线炒股天载分析市场呈现出一片跌势
  13. Not Shading英语翻译
  14. java MultipartFile转换File
  15. 6 统计正数和负数的个数然后计算这些数的平均值
  16. 差之毫厘.失之千里 英语学习新需求之.支持通配符的电子字典
  17. html 做笔记,HTML笔记(一)
  18. 百度AI攻略:黑白图像上色
  19. 四维图新地图坐标_四维图新:工信部商请公司提供电子地图相关数据
  20. Go HTTP包源码阅读 持续更新 0.0

热门文章

  1. quickselect_QuickSelect:使用代码示例解释的快速选择算法
  2. html中的两种标记,如何在html选项标记中实现两种不同的对齐?
  3. mysql 安装 se_mysql的安装过程
  4. String、StringBuffer、StringBuilder的理解
  5. 专访小邪:从十年技术之路看阿里技术体系的变革
  6. Odoo 学习 【二】Environment 概览
  7. \r与\n有何差别,编码的时候应该怎样使用
  8. C# MoreLinq 扩展安装
  9. 用户输入一个数字,找到所有能够除尽它的数的总个数
  10. HTML5学习笔记二 HTML基础