第七篇:使用 fcntl 函数 获取,设置文件的状态标志
前言
当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?
本文将告诉你如何用 fcntl函数 获取指定文件的状态标志。
解决思路
1. 对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状态标志常量进行&操作。若操作结果为正则文件具有此状态标志,否则文件没有此状态标志。( 如果是检查只读,只写,可读可写,则需要和ACCMODE相&,然后判断其结果是否为O_RDONLY,O_WRONLY,O_RDWR)。
2. 对于增加文件状态标志,我们可以先调用fcntl函数得到一个记录文件标志的整型变量,然后让它 |= 你想为其增设的状态标志,最后再调用fcntl函数保存这个标志。
3. 对于删除文件状态标志,我们可以先调用fcntl函数得到一个记录文件标志的整型变量,然后让它 &= 你想为其增设的状态标志的~,最后再调用fcntl函数保存这个标志。
PS:调用fcntl函数需要包含 fcntl.h 头文件
示例代码 - 获取文件的状态标志
#include "apue.h"
#include <fcntl.h> int
main(int argc, char *argv[])
{
int val; // 以文件标志符作参数
if (argc != )
err_quit("usage: a.out <descriptor#>"); // 将字符串类型的文件标志符转换成整型
if ((val = fcntl(atoi(argv[]), F_GETFL, )) < )
err_sys("fcntl error for fd %d", atoi(argv[])); /*
* 下段代码检测标识符对应文件的读写属性
*/
switch (val & O_ACCMODE) {
case O_RDONLY:
printf("read only");
break; case O_WRONLY:
printf("write only");
break; case O_RDWR:
printf("read write");
break; default:
err_dump("unknown access mode");
} /*
* 下段代码检测标识符对应文件的其他属性
*/
if (val & O_APPEND)
printf(", append");
if (val & O_NONBLOCK)
printf(", nonblocking"); // 对于定义了O_SYNC标志的系统检测该标志
#if defined(O_SYNC)
if (val & O_SYNC)
printf(", synchronous writes");
#endif
#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)
if (val & O_FSYNC)
printf(", synchronous writes");
#endif
putchar('\n');
exit();
}
示例代码 - 增加文件的状态标志
#include "apue.h"
#include <fcntl.h> void
set_fl(int fd, int flags)
{
int val; // 获取记录状态标志的整型变量
if ((val = fcntl(fd, F_GETFL, )) < )
err_sys("fcntl F_GETFL error"); // 增加状态标志
val |= flags; // 保存状态标志
if (fcntl(fd, F_SETFL, val) < )
err_sys("fcntl F_SETFL error");
}
示例代码 - 删除文件的状态标志
#include "apue.h"
#include <fcntl.h> void
set_fl(int fd, int flags)
{
int val; // 获取记录状态标志的整型变量
if ((val = fcntl(fd, F_GETFL, )) < )
err_sys("fcntl F_GETFL error"); // 删除状态标志
val &= ~flags; // 保存状态标志
if (fcntl(fd, F_SETFL, val) < )
err_sys("fcntl F_SETFL error");
}
说明
fcntl函数的功能远不及此,其他的功能会随着学习的深入再做讲解。
第七篇:使用 fcntl 函数 获取,设置文件的状态标志的更多相关文章
- 使用 fcntl 函数 获取,设置文件的状态标志
前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. ...
- fcntl获取和修改文件打开状态标志
[root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...
- fcntl函数用法——设置文件锁
fcntl函数.锁定文件,设置文件锁.设置获取文件锁:F_GETLK .F_SETLK .F_SETLKW文件锁结构,设置好用于fcntl函数的第三个参数.struct flock{ shor ...
- fcntl函数用法——操纵文件描述符状态
fcntl函数:操纵文件描述符,改变已经打开的文件的属性int fcntl(int fd, int cmd, ... //arg );cmd选项:一.复制文件描述符:F_DUPFD二.更改设置文件描 ...
- [VB.NET]调用API获取/设置键盘按键状态
1.调用GetAsyncKeyState()获取指定按键的状态,GetActiveKey()检索指定范围内的按键状态 2.调用keybd_event()可合成一次击键事件,通常两次击键事件间需要设定时 ...
- GetFontResourceInfo 函数: 获取字体文件对应的字体名
在 win 7, gdi32.dll,找不到 GetFontResourceInfo(), 但能找到 GetFontResourceInfoW(), 用法类似. //----------------- ...
- 第七篇:两个经典的文件IO程序示例
前言 本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅. 程序功能 程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据. 程序一代码及其注释 # ...
- fcntl函数用法——复制文件描述符
文件描述符复制和输出重定向dup() 用最小的文件描述符来复制,从0开始搜素.复制文件描述符后,最小文件描述符指向被复制描述符指向的文件.dup2(int oldfd,int newfd) 强制用ne ...
- fcntl()函数之文件打开状态
比较有用的就两个. 1.获得/设置文件打开状态标志 oldflag=fcntl(fd,F_GETFL); 获得打开文件的状态标志. arg=oldflag|O_APPEND; fcntl(fd,F_S ...
随机推荐
- DevOps,不是一个传说!
转自: http://www.infoq.com/cn/articles/devops-not-legend DevOps最近成了热词,望文生义,你也能猜个八九不离十,它就是在说"研发团队& ...
- kettle--组件(1)--值映射
组件:值映射 如下如所示: 首先,给出官方给出的文档: 个人理解: Target field name:可以理解为将source column的字段复制为另一个target column的名字. De ...
- Unity3D碰撞器事件测试(Rigidbody/Kinematic/Trigger/Collider)
1.Kinematic和刚体之间的碰撞事件 Unity官方有一个详细的碰撞关系表:http://docs.unity3d.com/Manual/CollidersOverview.html 但其实可以 ...
- ORACLE建立物化视图
--使用 on commit 的方式建立物化视图 create materialized view emp_dept refresh on commit as select t.*,d.dname f ...
- CSRF学习笔记之CSRF的攻击与防御以及审计【00x1 】
+++++++++++++++++++++++++++ + 00x1 实现简单的攻击 + 00x2 代码审计漏洞的源头 +++++++++++++++++++++++++++ 00x1 简单的csrf ...
- Extjs的完成按钮和位置
this.toolbar.add('->') ---重点是这个箭头,他是控制位置的 this.CompleteDataAction = new Ext.Action({ text : '完成', ...
- 球队以及得分计算的SQL语句
首先题目是这样的: 球队表teams 比赛表matches 赢了得3分,平局的得1分,输了得0分. 思路: 一个球队的成绩分为两部分,作为主队的得分和作为客队的得分: 计算出一次比赛中具体得了多少分, ...
- Unix系统编程(四)creat系统调用
我好疑惑啊,creat系统调用为啥没有以e结尾呢?搞得我每次都怀疑我敲错了. 在早期的UNIX实现中,open只有两个参数,无法创建新文件,而是使用creat系统调用创建并打开一个新文件. int c ...
- linux--jdk安装与配置
此处以centos下jdkjdk1.8.0_161安装(此处为rpm安装事例)为例 1.java官网下载页找到对应版本的jdk下载链接地址 2.下载对应版本的rmp包到服务器,执行如下指令: wget ...
- git设置忽略文件和目录
1.登录gitbash命令端进入本地git库目录 Administrator@PC201601200946 MINGW32 /d/gitrespository/crmweb (master) 2.创建 ...