尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Linux五种I/O模型与fcntl非阻塞控制
目录1 ~ 五种 I/O 模型1.1 I/O1.1 I/O 模型1.2 阻塞 vs 非阻塞1.3 同步I/O vs 异步I/O2 ~ 非阻塞I/O2.1 fcntl2.2 非阻塞代码1 ~ 五种 I/O 模型1.1 I/OI/Oinput / output输入/输出是指计算机核心处理系统CPU/内存与外部设备外设存储驱动器或网络接口之间的数据传输与通信过程。IO 的效率其实并不高当我们调用recv只有当接收缓冲区中有数据时recv才能够返回不然就会阻塞等待数据就绪。所以I/O 等 拷贝。为什么效率不高就是因为要等而拷贝的时间消耗相比于等待所占的比重就少很多。所以高效IO 就是围绕如何在单位时间减少等待的比重。1.1 I/O 模型1阻塞 I/O在系统调用完成读取或写入之前应用程序进程/线程会一直阻塞暂停执行。2非阻塞 I/O如果底层数据没有准备好系统调用就会立即返回需要线程定期轮询检查状态。3信号驱动 I/O当底层数据准备就绪后内核会主动向应用程序发送信号如SIGIO进行通知。4I/O 多路转接通过select、poll、epoll接口让单个进程/线程同时监控多个文件描述符当任意文件描述符就绪时就触发响应然后应用程序进行I/O。5异步 I/O内核自动完成等待数据就绪以及将数据拷贝到用户空间内存的全过程仅在全部操作完成后通知应用程序。下面我们通过一个钓鱼的例子来加深对5种I/O模型的理解阻塞I/O张三在钓鱼时什么也不干一直盯着鱼鳔看一旦有鱼上钩了就开始往上钓。非阻塞I/O李四在钓鱼时抛竿后就开始刷抖音然后时不时抬头看一个鱼竿的动静没鱼上钩就继续刷抖音有鱼上钩就往上钓。信号驱动I/O王五在钓鱼时在鱼竿上面系一个铃铛然后就也去刷抖音了但是王五只有在铃铛响之后才会开始往上钓鱼。I/O多路转接赵六钓鱼时直接拉来了一车鱼竿全部抛竿后然后过来过去查看鱼竿状态发现哪个有鱼上钩就开始往上钓。异步I/O田七只喜欢吃鱼于是对秘书说“你在这钓鱼我现在去开会钓到之后你打电话叫我我过来接你。”1.2 阻塞 vs 非阻塞1非阻塞I/O的效率是不是比阻塞I/O的效率高如果单纯就I/O 的效率来讲阻塞与非阻塞效率是相同的因为 I/O 等 拷贝两者只是等待的方式不同。但非阻塞I/O 在等待的时间里做了更多事所以非阻塞对于时间的利用率更高。2那么哪一种方式的效率更高呢谁在 I/O 过程中等待的时间最短那么谁的效率就最高。对于赵六而言他一次性监控了大量的鱼竿钓完一杆I/O很快就发现又有鱼上钩了数据就绪。这个过程中赵六没怎么等几乎一直在上钩。所以多路转接 I/O 的效率是最高的。1.3 同步I/O vs 异步I/O阻塞、非阻塞、信号驱动和多路转接 I/O 都属于同步 I/O对于同步 I/O 而言可以简单理解为应用进程或线程一定参与了等待或拷贝中的一个环节或者都参与了。异步I/O 一定没有参与等待和拷贝任意一个环节。2 ~ 非阻塞I/O2.1 fcntl#includeunistd.h#includefcntl.hintfcntl(intfd,intcmd,.../* arg */);fd即要控制的文件描述符。cmd代表你要进行什么操作。第三个参数根据cmd决定传指针或整数。返回值成功由cmd决定失败返回-1错误码被设置。cmd参数F_GETFL获取文件状态标志intflagsfcntl(fd,F_GETFL);if(flags-1){perror(fcntl);}F_SETFL设置文件状态标志// 设置文件描述符为非阻塞// 1. 获取原有标志intflagsfcntl(fd,F_GETFL);// 2. 添加 O_NONBLOCK 非阻塞不能直接赋值要保留原有flagfcntl(fd,F_SETFL,flags|O_NONBLOCK);F_DUPFD复制文件描述符intnewfdfcntl(oldfd,F_DUPFD,low);类似dup()。复制fd返回一个大于等于minfd的新文件描述符。F_SETOWN设置拥有者信号驱动 IO 必备// socket就绪时向这个进程PID发送SIGIO信号fcntl(sockfd,F_SETOWN,getpid());今天我们只用到获取和设置文件描述符状态的功能2.2 非阻塞代码当我们正常从标准输入获取数据默认std::cin是阻塞的即 0 号文件描述符阻塞。// 将指定文件描述符设置为非阻塞 void SetNoblock(int fd) { int fl fcntl(fd, F_GETFL); if(fl 0) { std::cout 出错 std::endl; return; } // 保持原状态不变并将将标准输入设置为非阻塞 fcntl(fd, F_SETFL, fl | O_NONBLOCK); }// 非阻塞IOvoidtest2(){SetNoblock(0);// 将标准输入设置为非阻塞charbuff[1024];while(true){intnread(0,buff,sizeof(buff));if(n0){buff[n-1]0;std::coutbuffstd::endl;}elseif(n0){if(errnoEINTR){std::cout信号中断std::endl;continue;}elseif(errnoEAGAIN|EWOULDBLOCK){std::cout底层数据没有准备好(未就绪)std::endl;sleep(2);continue;}else{std::cout出错std::endl;break;}}elsebreak;// 读到文件末尾}}文件描述符在非阻塞状态下如果再调用读或者写之类的接口就需要对返回值为 -1 这种情况进行更加细致的判断errno EAGAIN||errno EWOULDBLOCK表示底层数据没有准备好下次就绪后再来读。errno EINTR表示信号中断重试即可。其他表示真正出错了。此时如果底层没有数据就绪就会直接返回。
RELATED

相关推荐

提示词工程实战指南:从基础结构到工作流构建

提示词工程实战指南:从基础结构到工作流构建

1. 先搞清楚提示词工程到底解决什么问题 如果你刚开始接触大语言模型,比如 ChatGPT、Claude 或者国内的文心一言、通义千问,最常遇到的困惑可能就是:为什么同一个模型,别人问出来的答案又准又好,自己问出来的却总是跑偏…

📅 2026/9/9 15:49:38
AI驱动仿真:COMSOL与Python结合加速电机NVH设计与优化

AI驱动仿真:COMSOL与Python结合加速电机NVH设计与优化

在实际电机设计与NVH(Noise, Vibration, Harshness,噪声、振动与声振粗糙度)性能优化领域,工程师们长期面临一个核心矛盾:传统的仿真分析流程虽然精确,但往往耗时漫长、迭代成本高昂。一个典型的永磁同步电…

📅 2026/9/9 21:22:35
特斯拉NOA自动辅助导航驾驶:从车道保持到路径决策的智能跃迁

特斯拉NOA自动辅助导航驾驶:从车道保持到路径决策的智能跃迁

1. 从“辅助”到“导航”:NOA功能的核心跃迁 最近,特斯拉在国内悄然开启了NOA(Navigate on Autopilot,自动辅助导航驾驶)功能的内测,这消息在车主圈和科技圈都激起了不小的水花。很多人可能觉得&#xff0c…

📅 2026/10/5 17:50:08
MORE NEWS

更多资讯

📰

CVE-2025-14528:D-Link DIR-803配置信息泄露漏洞解读

CVE-2025-14528 这串编号,最近在圈子里又让一台老设备重新回到聚光灯下——D-Link DIR-803。一台早就被厂商列为生命周期终止(EOL)的家用路由器,这次摊上的是“配置处理信息泄露”。光看名字或许觉得只是吐点配置出来,…

📰

从0到2万Star:一套AI编程实操教程的完整复盘

后台数据页上,Star数跳过2万整数关口的那一刻,我截图发给朋友:“这套AI编程教程,被某主流AI助手产品推荐了。”说实话,比起2万这个数字本身,更让我意外的是推荐带来的那条增长曲线——几乎垂直向上。这套教…

📰

Linux下QT C++集成海康SDK:实时取流与云台控制实战

简介:这份资源面向在Linux平台从事视频监控客户端开发的C/Qt工程师,聚焦于调用海康威视SDK实现实时取流与云台控制这一典型场景。包内共36个文件,以23个so动态库、4个h头文件、2个cpp源码及ui界面文件为主,另含CMake工程配置与日志…

📰

杰理692N SDK开发入门:从源码结构到跑通第一个音频工程

简介:这份杰理692N开发入门教程SDK源码面向蓝牙、Wi-Fi等无线通信方向的嵌入式开发者与初学者,帮助其快速搭建692N芯片的开发环境并理解SDK整体架构。压缩包共647个文件,约40.08MB,以241个h头文件与127个c源文件为核心&#xff0c…

📰

AgentRouter config.toml 配置详解:Codex中转站工程化落地指南

1. 为什么非得手写 config.toml?AgentRouter 不是自带配置向导吗?“Codex 接中转站”这个说法,其实不是某个官方术语,而是某类开发者在实际落地大模型应用时自发形成的工程共识——当本地或私有部署的 Codex 类模型(比…

📰

博格尔长期投资回报模型:用股息率、盈利增长与估值变化拆解市场

很多人刚接触投资时,对“预测市场”这件事既渴望又怀疑。渴望的是想提前知道未来几年能赚多少钱,怀疑的是那些天天喊点位、画K线的分析师自己也常常打脸。我自己在做了十几年指数化投资之后,反而越来越相信一套几乎不需要主观判断的模型——约…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬