Linux中的高级IO函数(三)fcntl

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:

用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。
用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。
用于控制I/O行为和属性的函数,包括fcntl函数。

本节接着介绍第三类

一、fcntl函数

fcntl函数全称是 file control 。该函数提供了对文件描述符的各种控制操作。另外一个常见的控制文件描述符属性和行为的系统调用是ioctl,而且ioctlfcntl能够执行更多的控制。但是,对于控制文件描述符常用的属性和行为,fcntl函数是由POSIX规范指定的首选方法。

#include <fcntl.h>int fcntl(int fd, int cmd,  ...);
  • fd参数是被操作的文件描述符

  • cmd参数指定执行何种类型的操作

下面是一些常见的操作

cmd含义第三个参数类型成功时返回值
F_DUPFD复制文件描述符int复制的新文件描述符
F_GETFD获取文件描述符标志文件描述符标志位(整数)
F_SETFD设置文件描述符标志int0(成功)或 -1(失败)
F_GETFL获取文件状态标志文件状态标志位(整数)
F_SETFL设置文件状态标志int0(成功)或 -1(失败)
F_GETLK获取记录锁struct flock *0(无冲突)或 -1(失败)
F_SETLK设置记录锁const struct flock *0(成功)或 -1(失败)
F_SETLKW设置记录锁(阻塞版本)const struct flock *0(成功)或 -1(失败)
F_GETOWN获取异步I/O所有权所有权的进程ID(整数)
F_SETOWN设置异步I/O所有权pid_t0(成功)或 -1(失败)
F_GETLK64获取记录锁(64位版本)struct flock64 *0(无冲突)或 -1(失败)
F_SETLK64设置记录锁(64位版本)const struct flock64 *0(成功)或 -1(失败)
F_SETLKW64设置记录锁(阻塞版本,64位版本)const struct flock64 *0(成功)或 -1(失败)
F_GETSIG获取信号信号值(整数)
F_SETSIG设置信号int0(成功)或 -1(失败)
F_GETLEASE获取文件租约状态租约状态(整数)
F_SETLEASE设置文件租约int0(成功)或 -1(失败)
F_NOTIFY监视文件状态变化int0(成功)或 -1(失败)
F_GETPIPE_SZ获取管道容量管道容量(整数)
F_SETPIPE_SZ设置管道容量int0(成功)或 -1(失败)
F_GET_SEALS获取文件封印状态文件封印状态(整数)
F_ADD_SEALS添加文件封印unsigned int0(成功)或 -1(失败)
F_GET_RW_HINT获取读写优化提示读写优化提示(整数)
F_SET_RW_HINT设置读写优化提示unsigned int0(成功)或 -1(失败)
F_GET_FILE_RW_HINT获取文件读写优化提示读写优化提示(整数)
F_SET_FILE_RW_HINT设置文件读写优化提示unsigned int0(成功)或 -1(失败)
F_GETLKPID获取记录锁并返回占有者的进程IDstruct flock *占有者的进程ID(整数)或 -1(失败)
F_OFD_GETLK获取OFD记录锁struct flock *0(无冲突)或 -1(失败)
F_OFD_SETLK设置OFD记录锁const struct flock *0(成功)或 -1(失败)
F_OFD_SETLKW设置OFD记录锁(阻塞版本)const struct flock *0(成功)或 -1(失败)

在常见的编程中,fcntl函数通常用来将一个文件描述符设置为非阻塞的。

int setnonblocking(int fd) {/* 获取文件描述符旧的状态标志 */int old_option=fcntl(fd,F_GETFL);/* 设置非阻塞标志 */int new_option=old_option|O_NONBLOCK;/* 写入设置 */fcntl(fd,F_SETFL,new_option);/* 返回文件描述符旧的状态标志,以便日后恢复该状态标志 */return old_option;
}

此外,SIGIOSIGURG这两个信号与其他Linux信号不同,它们必须与某个文件描述符相关联方可使用:当被关联的文件描述符可读或可写时,系统将触发SIGIO信号;当被关联的文件描述符(而且必须是一个socket)上有带外数据可读时,系统将触发SIGURG信号。将信号和文件描述符关联的方法,就是使用fcntl函数为目标文件描述符指定宿主进程或进程组,那么被指定的宿主进程或进程组将捕获这两个信号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

39. 【Android教程】触摸事件分发

用户在使用 Andriod 系统的时候会不断的和我们的 App 进行各种类型的交互&#xff08;类似点击、滑动等等&#xff09;&#xff0c;“事件”就是一个非常有效的用来收集用户行为的方式。在前面章节有提到过&#xff1a;Android 系统采用一个先进先出&#xff08;FIFO&#xff0…

使用IPEX-LLM加速大语音模型LLM

IPEX-LLM是一个用于在英特尔CPU和GPU&#xff08;如本地PC的iGPU、独立显卡如Arc、Flex和Max&#xff09;上加速本地LLM推理和微调的PyTorch库。 IPEX-LLM是BigDL-LLM的升级版。IPEX-LLM基于英特尔PyTorch扩展库&#xff08;IPEX&#xff09;以及llama.cpp、bitsandbytes、vLL…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

Jammy@Jetson Orin - Tensorflow Keras Get Started

JammyJetson Orin - Tensorflow & Keras Get Started 1. 源由2. 步骤3. 预期&展望4. 总结5. 参考资料 1. 源由 之前过年的时候&#xff0c;花了两周的时间过了一遍 《ubuntu22.04laptop OpenCV Get Started》。 后续更多的时间需要再GPU算法上下功夫&#xff0c;目前…

如何在PostgreSQL中使用索引覆盖扫描提高查询性能?

文章目录 解决方案1. 创建合适的索引2. 确保查询能够使用索引覆盖扫描3. 调整查询以利用索引覆盖扫描4. 监控和调优 示例代码1. 创建索引2. 编写查询3. 检查是否使用索引覆盖扫描4. 调整索引 总结 在PostgreSQL中&#xff0c;索引是提高查询性能的关键工具之一。索引允许数据库…

Mybatis-plus 分页 自定义count方法

起因 使用了mybatisplus语句中有order by 语法mybatisplus会使用 select count(*) from (子语句) TOTAL 算出total但是会报错 查询条件QueryWrapper中还有order by排序条件,则生成的select count(*) from(sql) 就会报错 除非另外还指定了 TOP、OFFSET 或 FOR XML&#xff0c;否…

文章生成器免费版有哪些,哪个好用?

作为一个长期需要写作的人&#xff0c;对文章生成器自然是非常了解&#xff0c;如果搜文章生成器互联网上多到让人应接不暇&#xff0c;但小编今天要谈的是文章生成器免费版&#xff0c;因为看到很多写手朋友都想找一个免费的文章生成器来用&#xff0c;但是大家在网上搜可能很…

GITHUB的VB代码无法加载的问题解决

GITHUB里有不少好的VB代码&#xff0c;但是下载之后&#xff0c;经常出现工程加载出错的问题&#xff0c;例如&#xff1a; LOG文件为&#xff1a; 不能加载 0 行 0: 不能加载文件 D:\xxxx\Semi VB API Loader\frmMain.frm 。 原因其实很简单&#xff0c;github里的换行符是u…

巧用Stream流解决Page分页连表查询一对多展示错误的问题

1. 简介 在数据库一对多的情况下&#xff0c;使用Page分页查询这种Vo的时候如果直接查询会导致每页展示的条数不一致。 简单的代码如下 用户类 public class User{private Integer id; }地址类 public class UserAddress {private Integer id;private String address;private…

Promise.all 的方法还没执行完就执行了.then

碰见一个问题&#xff0c;接盘了一个有问题的页面修改。 改变日期后 查询很多数据再去重新加载页面上的数据显示相关的组件。 问题就来了。 加载异常捏…… 最后我一通查&#xff1a; 重点来了 是因为这个Promise.all(数组)&#xff0c;里边这个数组的问题。现在是在数据中…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

1、什么是单例模式&#xff1f; Java单例模式是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 2、实现方式 懒汉式&#xff1a;在类加载的时候就创建对象&#xff0c;…

Rust常用特型之Default特型

在Rust标准库中&#xff0c;存在很多常用的工具类特型&#xff0c;它们能帮助我们写出更具有Rust风格的代码。 某些类型可以有一个有意义的默认值&#xff0c;例如默认的向量或者字符串是空的&#xff0c;默认的数字为0&#xff0c;默认的Option是None等。 这样的类型可以实现…

Linux - tar (tape archive)

tar 的全称是 Tape Archive。它最初是在 Unix 系统中用于将数据写入磁带的工具&#xff0c;但现在它通常用于创建、维护、修改和提取文件的归档文件。尽管 tar 可以用于压缩和解压缩文件&#xff0c;但它本身并不进行压缩&#xff0c;而是通常与 gzip 或 bzip2 等压缩工具一起使…

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先&#xff0c;非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前&#xff0c;参加了文心智能体平台&#xff…

vi编辑器的用法linux中的vim编辑器大全

vim的介绍 vi 和 vim 命令是linux中强⼤的⽂本编辑器, 由于Linux系统⼀切皆⽂件&#xff0c;⽽配置⼀个服务就是在修改其配置⽂件的参数。 vim 编辑器是运维⼯程师必须掌握的⼀个⼯具, 没有它很多⼯作都⽆法完成。 其中有vi和vim两种 vi和vim的区别 Vim是Vi的升级版本&#…

了解IOS 中时间格式化 “en_US_POSIX” 的含义

最近在解决一个时间显示上的 bug&#xff0c;在 iOS 上显示时间时&#xff0c;如果用户默认选择的是 24 小时制&#xff0c;当然不会出现问题&#xff0c;但是选择的是 12 小时制&#xff0c;那么就会出现问题&#xff1a; 24 小时制 09:01:00 12 小时制 上午09:01:00 我们可以…

【Java 多线程】Volatile 详解

Volatile 为了平衡 CPU、内存和 IO 设备之间的读写速度&#xff0c;充分利用 CPU 的高性能&#xff0c;我们的计算机体系结构、操作系统以及编译程序都做了很多的优化&#xff1a; CPU 增加了高速缓存来平衡 CPU 和内存之间的速度差异&#xff0c;这也就导致可见性问题操作系…

无人机类型有哪些?

无人机可以按照多种方式进行分类&#xff0c;每种分类都有其特定的无人机类型。以下是一些常见的分类方式及其对应的无人机类型&#xff1a; 1. 按飞行平台构型分类&#xff1a; * 固定翼无人机 * 旋翼无人机 * 无人飞艇 * 伞翼无人机 * 扑翼无人机 2. 按用途分类&#xff1a…