第七篇:使用 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(‘\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函数的功能远不及此,其他的功能会随着学习的深入再做讲解。

时间: 2024-08-05 06:36:49

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

[VB.NET]调用API获取/设置键盘按键状态

1.调用GetAsyncKeyState()获取指定按键的状态,GetActiveKey()检索指定范围内的按键状态 2.调用keybd_event()可合成一次击键事件,通常两次击键事件间需要设定时间间隔 3.调用MapVirtualKey()获取指定按键的硬件扫描码,传入keybd_event()第二个参数就可以对DirectInput有效. Public Class ImitateKeyClass Private Declare Sub keybd_event Lib "user32&qu

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

前言 本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅. 程序功能 程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据. 程序一代码及其注释 1 #include <iostream> 2 #include <fstream> // 使用文件处理对象记着要包含这个头文件 3 #include <string> 4 #include <vector> 5 6 using namespace std; 7

UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质

lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ... /* int arg */); fcntl 函数有 5 种功能: 1. 复制一个现有的描述符(cmd=F_DUPFD). 2. 获取/设置文件描述符标志(cmd=F_GETFD 或F_SETFD). 3. 获取/设置文件状态标志(cmd=F_GETFL 或F_SETFL). 4. 获取/设置异步 I/

Linux环境编程之文件I/O(五):fcntl函数

引言: 对于一个普通的文件,我们可以想到的对它的操作有,读取文件的内容.写数据到文件中,这些都是前面提到的read.write函数的作用.除此之外,还可以获取文件的其他性质,并对这些性质进行修改,比如文件的描述符.文件描述符标记.文件状态标志等等.这些对文件性质的修改就由fcntl函数完成. 函数介绍: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 参数: fd:

fcntl 获取文件状态标志

int fcntl(int fd,int cmd,...) 函数fcntl提供了非常丰富的功能.主要依赖于cmd的各种参数: 复制已有的文件描述符 F_DUPFD,F_DUPFD_CLOEXEC 获取设置文件描述符的标志 F_GETFD,F_SETFD 获取设置文件状态标志 F_GETFL,F_SETFL 获取设置异步IO的所有权 F_GETOWN,F_SETFL 获取设置记录锁 F_GETLK,F_SETLK,F_SETLKW 当cmd= F_GETFL时,fcntl的功能就是获取fd的文件状

文件控制 fcntl函数详解

摘要:本文主要讨论文件控制fcntl函数的基本应用.dup函数可以复制文件描述符,而fcntl函数与dup函数有着异曲同工之妙.并且还有更加强大的功能,可以获取或设置已打开文件的性质,操作文件锁. 1.fcntl函数 在<重定向编程 dup和dup2>一文中,介绍了dup和dup2两个函数,函数是提供了复制一个现存的文件描述符的功能,而本文介绍的fcntl函数提供了进一步管理文件描述符的各种手段,用它可以对以打开的描述符执行各种控制操作,比如,可以像dup和dup2一样复制一个文件描述符,还有

(待续)文件IO详解(十六)---fcntl函数详解

fcntl函数是用来在进程中实现对文件的多种操作的函数,通过不同的命令可以实现不同的操作.常用的操作有复制文件描述符.为文件设置建议锁和获取设置文件控制标志等. ======================================================= 函数原型: ======================================================= 操作一:复制文件描述符实现文件共享 函数参数: fd:要操作的文件描述符 cmd:F_DUPFD ar

高级I/O函数(3)-tee、fcntl函数

tee函数使用 功能描述:tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作.它不消耗数据,因此源文件描述符仍然可以用于后续的操作. 函数原型: #include <fcntl.h> ssize_t tee(int fd_in,int fd_out,size_t len,unsigned int flags); 函数参数:fd_in和fd_out必须都是管道文件描述符. 返回值:成功时返回在两个文件描述符之间复制的数据字节数,返回0表示没有复制任何数据.失败时返回-1并设置errno.

六、文件IO——fcntl 函数 和 ioctl 函数

6.1 fcntl 函数 6.1.1 函数介绍 1 #include <unistd.h> 2 #include <fcntl.h> 3 int fcntl(int fd, int cmd); 4 int fcntl(int fd, int cmd, long arg); 5 int fcntl(int fd, int cmd, struct flock * lock); 函数说明:fcntl()用来操作文件描述词的一些特性. 函数功能:可以改变已经打开文件的性质 参数说明 @fd