C++ 的fcntl函数
C++ 中的 fcntl 函数是一个 Unix/Linux 系统下的系统调用,用于控制打开的文件描述符的一些属性和行为。函数原型如下:
#include <unistd.h>
#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */);
其中,函数参数 fd 表示要控制的文件描述符,cmd 表示要进行的操作命令,arg 表示要传递的参数,具体含义和类型和操作命令相关。fcntl 函数返回值表示函数执行的结果,通常为非负整数,或者 -1 表示出错。
常用的操作命令和相关参数含义有:
F_DUPFD
:复制文件描述符,用于创建一个新的文件描述符,从而与一个已经打开的文件描述符绑定在一起。arg 参数为要绑定的新的文件描述符的最小值,返回表示新的文件描述符的整数值。
F_GETFD
:获取文件描述符标记,用于获取指定文件描述符的文件描述符标记值,返回表示标记值的整数值。
F_SETFD
:设置文件描述符标记,用于设置指定文件描述符的文件描述符标记值。arg 参数为要设置的文件描述符标记值,返回 0 表示设置成功,否则表示设置失败。
F_GETFL
:获取文件状态标记,用于获取指定文件描述符与其相关联的文件状态标记值,返回表示文件状态标记值的整数值。
F_SETFL
:设置文件状态标记,用于设置指定文件描述符和其相关联的文件状态标记值。arg 参数为要设置的文件状态标记值,返回 0 表示设置成功,否则表示设置失败。
F_GETOWN
:获取文件属主进程 ID,用于获取当前文件描述符的属主进程 ID 值。
F_SETOWN
:设置文件属主进程 ID,用于将文件属主进程 ID 设置为指定进程 ID 值。arg 参数为要设置的进程 ID 值,返回 0 表示设置成功,否则表示设置失败。
F_GETLK
:获取记录锁信息,用于查询文件中的记录锁信息。arg 参数应该指向一个描述记录锁信息的结构体 flock,返回值为阻塞状态和记录锁信息。
F_SETLK
:设置记录锁,用于设置指定文件中的记录锁。arg 参数应该指向一个描述记录锁信息的结构体 flock,返回值非零表示加锁成功。
F_SETLKW
:设置记录锁,在设置记录锁的同时,如果该文件的某一部分正被别的进程加了锁,将进入阻塞状态。arg 参数应该指向一个描述记录锁信息的结构体 flock,返回值为阻塞状态和记录锁信息。
需要注意的是,不同操作命令可能需要不同的参数类型和参数含义,具体的使用方式需要参考对应的操作命令和相关文档进行学习和掌握。
下面是一个 fcntl 函数使用的示例,实现将一个打开的文件描述符设置为非阻塞模式:
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>int main()
{int fd = open("test.txt", O_RDONLY); // 打开文件// 获取文件描述符的当前状态标志int flags = fcntl(fd, F_GETFL, 0);if (flags == -1) {std::cerr << "fcntl failed: " << errno << std::endl;return -1;}// 将文件描述符设置为非阻塞模式flags |= O_NONBLOCK; // 将非阻塞标志设置为 1if (fcntl(fd, F_SETFL, flags) == -1) {std::cerr << "fcntl failed: " << errno << std::endl;return -1;}// 在非阻塞模式下进行文件读取操作char buffer[1024];int nread = read(fd, buffer, sizeof(buffer));if (nread == -1 && errno == EAGAIN) {std::cout << "File is non-blocking." << std::endl;} else {std::cerr << "read failed: " << errno << std::endl;return -1;}close(fd); // 关闭文件return 0;
}
在上述代码中,fcntl 函数的使用分为以下几个步骤:
调用 open 函数打开一个文件,并获得文件的文件描述符 fd。
调用 fcntl(fd, F_GETFL, 0) 获取文件描述符的当前状态标志,并将获取的状态标志保存在变量 flags 中。
将 flags 变量的值按位或上 O_NONBLOCK 标志,将文件描述符设置为非阻塞模式。
在非阻塞模式下尝试读取文件,如果返回值为 -1 且errno为 EAGAIN,表示文件已经设置为非阻塞模式。
最后调用 close 函数关闭文件描述符 fd。
需要注意的是,fcntl 函数可以用于控制文件描述符的多个属性和行为,具体使用方法和参数含义需要根据实际情况进行学习和掌握。
C++ 的fcntl函数相关推荐
- 使用 fcntl 函数 获取,设置文件的状态标志
前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. ...
- 文件控制 fcntl函数具体解释
摘要:本文主要讨论文件控制fcntl函数的基本应用.dup函数能够拷贝文件描写叙述符,而fcntl函数与dup函数有着异曲同工之妙.而且还有更加强大的功能,能够获取或设置已打开文件的性质,操作文件锁. ...
- linux fcntl 函数 文件描述符选项控制
功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...
- Linux 系统 文件锁 fcntl函数详解
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...
- sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数
第一个函数:使用 sigaction函数: signal 函数的使用方法简单,但并不属于POSIX标准,在各类UNIX平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX标准定义的信号处 ...
- fcntl函数完成 set_fl()函数还有clr_fl()函数的封装
使用fcntl函数完成,set_fl和clr_fl()函数的封装,设置文件的属性,例如:阻塞IO模型 和 非阻塞IO模型 #include <stdio.h> #include " ...
- fcntl函数-文件控制函数
今日命令在vim中使用:vsplit ./include/io.h 是以垂直方式打开io.h文件 同理:split ./include/io.h 是以水平方式打开io.h文件 可以用fcntl 函数改 ...
- fcntl函数参数F_GETPIPE_SZ、F_SETPIPE_SZ报错引出的关于linux-specific头文件的使用方法...
直接来个例子说明: ----------------------------------- #include <unistd.h> #include <errno.h> #i ...
- fcntl函数之文件锁 F_SETLKW
fcntl函数之文件锁 F_SETLKW F_SETLK与F_SETLKW的区别: F_SETLK设的锁遇到锁被其他进程占用时,会立刻停止进程. F_SETLKW上锁是阻塞方式.设置的锁因为其他锁而被 ...
- fcntl函数之文件锁 F_SETLK
fcntl函数之文件锁 F_SETLK #include <stdio.h> #include <string.h> #include <unistd.h> #in ...
最新文章
- Ext JS学习第十六天 事件机制event(一)
- linux连接sftp服务器,如何在Linux上配置SFTP服务器
- mysql数据库中命令行下常用命令的操作(增、删、改、查)和数据类型
- Jmeter初探之录制
- android 中如何分析内存泄漏
- pandas常用函数总结
- java反射面试_总结Java反射面试题(附答案)
- 2020年最新as中jni----------动态注册
- 微信上传图片没反应_365微信编辑器图片上传不了怎么办?
- matplotlib learning-----案例:对比电影的票房收入(3)
- 模具分类以及塑胶模具设计流程
- svn服务器现存的库文件导入,svn导入版本库及相关知识
- 质安码区块链直推新零售通过线上线下资源整合,实现信息传递的最大化
- 如何理解DevOps
- 统计给定的n个数中,负数、零和正数的个数。
- UE4构建光照后,BSP创建的静态网格变全黑
- mysql group by 去除重复_mysql中distinct和group by过滤删除重复行
- Spring @Order注解详解
- 对上一篇文章《extern与头文件(*.h)的区别和联系》的学习体会
- 一个关于国产化适配 的PPT文案
热门文章
- 官方:“四个放宽”、“三个加强”安置退役军人
- 查看树莓派系统及版本
- 澳禁止华为参与5G网络建设;锤子将编写自己的OS;国产处理器兆芯可运行Windows,已试制出Intel i5级处理器丨Q新闻...
- 26. SAP ABAP OData Gateway 框架里 /IWFND, /IWBEP 这些缩写代表了什么含义?
- 使用TPC控制UR3机器臂python代码
- 大学毕业前最应该做的20件事
- 联想笔记本切换任务栏时卡顿
- 开发过程---统一过程
- 广东自贸区金融物联网新进展:广清所建类标准仓单
- windows10下载链接