博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第七篇:使用 fcntl 函数 获取,设置文件的状态标志
阅读量:5961 次
发布时间:2019-06-19

本文共 2495 字,大约阅读时间需要 8 分钟。

前言

       当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?

       本文将告诉你如何用 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 
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
");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 #endif50 #if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)51 if (val & O_FSYNC)52 printf(", synchronous writes");53 #endif54 putchar('\n');55 exit(0);56 }

示例代码 - 增加文件的状态标志

 

1 #include "apue.h" 2 #include 
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 
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函数的功能远不及此,其他的功能会随着学习的深入再做讲解。

转载地址:http://zkjax.baihongyu.com/

你可能感兴趣的文章
张军-大数据的理解与分布式进化计算方法
查看>>
dubbo remoting(2)
查看>>
maya pyside 多个窗口实例 报错 解决
查看>>
关于文件上传请求第一次为post,后面为get的问题
查看>>
【Qt笔记】QDialog--模态和非模态
查看>>
nginx 0.8.54/1.0.0 在cygwin环境下的编译(包括 nginx_mod_h264
查看>>
PowerDesigner生成Excel版本的数据库文件
查看>>
Oracle 查找常见耗性能的语句
查看>>
thinkphp 开启页面的Trace信息
查看>>
mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections
查看>>
android textview字体加下划线
查看>>
springMVC 定时任务
查看>>
Mint8(ubuntu16.04) 搭建微信Web开发工具
查看>>
PostgreSQL数据类型-数据类型简介和布尔类型
查看>>
PostgreSQL数据类型-二进制数据和字符串数据类型与字符串函数
查看>>
shell 基础
查看>>
twisted的LineReceiver的接口定义
查看>>
浅解用PHP实现MVC
查看>>
MySQL常用操作
查看>>
Yxcms网站管理系统安装
查看>>