fcntl函数简介和使用

一、fcntl函数的作用
read函数是典型的阻塞模型,当缓冲区里的数据不就绪的时候,会一直阻塞等待。这是正常的,因为文件描述符默认是阻塞IO,而我们可以通过 fcntl 接口函数将文件描述符设置为非阻塞IO。

设置成非阻塞IO以后,read函数会一直检测数据是否就绪,如果就绪就读取,并返回读取到的字符数;如果不就绪,就返回一个错误码。

二、fcntl 函数的声明
fcntl 函数的作用是操作一个文件的文件描述符,而设置成非阻塞IO只是 fcntl 函数的功能之一。

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

1、参数解析
第一个参数fd,指明你要操作哪个文件的文件描述符。
第二个参数cmd,也就是你要对该文件描述符进行何种操作。cmd的取值不同,后面追加的参数也不同。
cmd的取值 命令解析
F_DUPFD 复制一个现有的文件描述符
F_GETFD 或 F_SETFD 获得/设置文件描述符标记
F_GETFL 或 F_SETFL 获得/设置文件状态标记
F_GETOWN 或 F_SETOWN 获得/设置异步IO所有权
F_GETLK 或 F_SETLK( F_SETLKW ) 获得/设置记录锁
2、返回值解析
执行成功时,不同的cmd可能会对应不同的返回值,没有列举在下面的,比如F_SETFL,可能返回值类型为void。
在这里插入图片描述
执行出错时,也会有不同的返回值,此时可能就与cmd无关了。
在这里插入图片描述

三、使用fcntl 将文件描述符设置为非阻塞
1、设置非阻塞模式实现
以设置文件描述符为 0 的文件为例,将文件描述符设置为非阻塞状态,需要用到上述表格的第三个功能,获得/设置文件状态标记。基本思路为:第一步,先获取到原有的文件状态;第二步,在原有的基础上追加一种非阻塞状态。
函数准备好以后,在调用read函数之前先将 第0号文件描述符设置成非阻塞,然后再调用read函数。

非阻塞模式下,read函数如果发现数据尚未就绪,系统是以出错的形式返回的,很显然数据未就绪不算错误,那么要如何区分真正的错误 和 数据未就绪时的出错呢?
答案是errno,errno是错误码,正常情况下是0。当数据没有就绪的时候,errno的值是11,即EAGAIN 或者 EWOULDBLOCK,我们可以以此判断是否真的出错了。如果你在成功时打印errno,你会发现errno仍然是11,因为read读取到数据的时候,不会设置errno。


#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>void setNonBlock(){int fl = fcntl(0,F_GETFL);      //获取文件描述符为0的文件状态if (fl < 0){perror("fcntl");return;}fcntl(0, F_SETFL, fl | O_NONBLOCK); //追加文件描述符的状态为非阻塞
}int main(){setNonBlock();     //设置为非阻塞模式while (1){char buffer[1024];ssize_t s = read(0,buffer,sizeof(buffer)-1);        //非阻塞读取if (s > 0){buffer[s] = 0;write(1,buffer,s);        //将读取到的内容打印到屏幕上printf("read success, res: %d, content: %s\n",s, buffer);}else{if(errno == EAGAIN || errno == EWOULDBLOCK){printf("read failed, res: %d , errno: %d\n", s , errno);}}sleep(1);}return 0;
}

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

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

相关文章

发送java字节码的数据包

一些Java反序列化漏洞在利用时&#xff0c;要发送Java序列化值&#xff08;字节码&#xff09;到服务器。 我们在使用一些工具生成字节码后&#xff0c;可以通过python或者burp发送。 生成的字节码一般以两种形式存储&#xff1a; 1、二进制形式存储到 poc.ser 2、将字节码…

系统架构达人亲授:多电商活动从容应对的顶级秘籍!

大家好&#xff0c;我是小米&#xff0c;一个热爱技术分享的小伙伴。最近我参加了一场社招面试&#xff0c;遇到了一道非常有趣的题目&#xff1a;在面对多个电商活动时&#xff0c;从架构上需要做到什么支持呢&#xff1f;今天我就来和大家分享一下我的思考和解答。 引言 随…

关于面试总结--接口测试面试题

前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&#xff…

广州华锐互动:AI虚拟数字人为教培行业带来诸多变革和创新

随着科技的不断发展&#xff0c;人工智能技术已经逐渐渗透到各个行业&#xff0c;其中教育领域也不例外。近年来&#xff0c;AI虚拟数字人在教培行业的应用越来越广泛&#xff0c;为教育行业带来了诸多变革和创新。 广州华锐互动作为一家虚拟现实内容制作商&#xff0c;已开发了…

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中&#xff0c;如果后验分布 p&#xff08;θx&#xff09;与先验概率分布 p&#xff08;θ&#xff09;在同一概率分布族中&#xff0c;则先验和后验称为共轭分布&#xff0c;先验称为似然函数的共轭先验。 多…

尚硅谷Docker笔记-基础篇

B站视频&#xff1a;https://www.bilibili.com/video/BV1gr4y1U7CY 1.Docker简介 解决了运行环境和配置问题的软件容器 方便做持续集成并有助于整体发布的容器虚拟化技术 容器与虚拟机比较 Docker 容器是在操作系统层面上实现虚拟化&#xff0c;直接复用本地主机的操作系统…

防反接电路设计和保姆级实测

文末有封面图&#xff01;~&#xff01;~ 注意&#xff1a;正确的防反接电路在实验C ​​​​​​​ 前言 一、实验器材 二、实验步骤 正确的电路在实验C 1 实验A&#xff1a; 2 实际A数据&#xff1a; 3 实验A结论 4 实验B 5 实际B数据&#xff1a; 6 实际B结论&…

服务器感染了.DevicData-D-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 勒索病毒成为网络安全的严峻挑战&#xff0c;而最新的.DevicData-D-XXXXXXXX勒索病毒更是引起广泛关注。本文将深入介绍.DevicData-D-XXXXXXXX勒索病毒的特征&#xff0c;提供恢复被其加密的数据文件的方法&#xff0c;并分享预防措施&#xff0c;以确保您的数…

ubuntu or MacOS 源码安装 fmt fmtlib

1&#xff0c;前情 提醒这个源代码需要从release中下载 打包好的&#xff0c;而直接用git clone下载不了&#xff0c;可能github上的这个git clone的链接仅仅是给fmt lib的开发者使用的吧&#xff1b; 下载fmtlib的release源代码u下载fmtlib的release源代码 2&#xff0c;解压编…

Jmeter实现服务器端后台接口性能测试!

实现目的 在进行服务器端后台接口性能测试时&#xff0c;需要连接到Linux服务器端&#xff0c;然后通过命令调用socket接口&#xff0c;这个过程就需要用到jmeter的SSH Command取样器实现了。 脚本实现 设置CSV Data Set ConFig配置元件&#xff0c;参数化测试数据 设置SSH…

条件变量--使两个线程实现交替打印

一、介绍 什么是条件变量&#xff1f; 条件变量&#xff08;Condition Variable&#xff09;是多线程编程中用于线程间通信和同步的一种机制。它通常与互斥锁&#xff08;Mutex&#xff09;一起使用&#xff0c;用于解决线程竞争和避免忙等待的问题。&#xff08;条件变量不能…

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;用于存储文本信息。C标准库…

卫浴企业做网站的效果如何

卫浴产品无论工程还是家庭中都有较高需求度&#xff0c;相关品牌或经销商也不少&#xff0c;然而在实际经营中&#xff0c;卫浴品牌商家也面临着一些痛点&#xff1a; 1、品牌宣传拓客难 卫浴产品并不缺客户&#xff0c;但大小品牌众多&#xff0c;商家想要突围绝非易事&…

【Pytorch】学习记录分享2——Tensor基础,数据类型,及其多种创建方式

pytorch 官方文档 Tensor基础&#xff0c;数据类型&#xff0c;及其多种创建方式 1. 创建 Creating Tensor&#xff1a; 标量、向量、矩阵、tensor2. 三种方法可以创建张量&#xff0c;一是通过列表(list)&#xff0c;二是通过元组(tuple)&#xff0c;三是通过Numpy的数组(arra…

java 家教管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 家教管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

企业文档管理混乱?解密难题并找到高效解决方案!

由于大多数企业的内部文件都分散地存放在各员工电脑中&#xff0c;且没有使用文档管理系统&#xff0c;导致企业内部出现诸多文件安全隐患&#xff0c;例如&#xff1a; 1.文档分散存储在员工个人计算机中&#xff0c;当发生人事变动时文档常常遗失&#xff0c;且可能给企业造…

Ransac 算法的探索和应用

Ransac 算法python 应用和实现 Ransac 算法是一种常用的图像匹配算法&#xff0c;在参数估计领域也经常被使用到。针对估计各种曲线的鲁棒模型参数&#xff0c;效果显著。这里对ransac算法进行某些探索。 python program: import numpy as np import matplotlib.pyplot as p…

【Jmeter】Jmeter基础7-Jmeter元件介绍之后置处理器

后置处理器主要用于处理请求之后的操作&#xff0c;通常用来提取接口返回数据 2.7.1、JSON JMESPath Extractor 作用&#xff1a;可以通过JmesPath语法提取所需要的值使用场景&#xff1a;取样器返回格式为jsonJmesPath语法&#xff1a;参考https://jmespath.org/tutorial.htm…

怎么让mac右上角的时间不显示

时间成了影响工作效率和心态的一个东西&#xff0c;当我看不见时间的时候我是听命于我的平静而稳定的内心的&#xff0c;当时间时刻在我的眼前晃动的时候&#xff0c;我是慌乱而浮躁的&#xff0c;所以我决定在我工作的时候我不需要时间&#xff0c;我要听命于自己的状态&#…

2023自动化测试框架的设计原则你都知道吗?快来看!

1.代码规范 测试框架随着业务推进&#xff0c;必然会涉及代码的二次开发&#xff0c;所以代码编写应符合通用规范&#xff0c;代码命名符合业界标准&#xff0c;并且代码层次清晰。特别在大型项目、多人协作型项目中&#xff0c;如果代码没有良好的规范&#xff0c;那么整个框架…