当前位置: 首页 > news >正文

多路io(select/epoll)

定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力。 io事件(读写)的通知机制。

作用:
应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标的输入、中断信号等等事件,再比如web服务器如nginx,需要同时处理来来自N个客户端的事件。
单个执行体(单进程,单线程)中,需要检测多个阻塞设备。

IO模型
1、阻塞IO 默认
2、非阻塞IO EAGAIN 忙等待 errno 需要掌握设置方法 fctnl
3、信号驱动IO SIGIO 用的相对少(了解)
4、并行模型 进程,线程
5, IO多路复用 select、poll、epol

一、select 使用的步骤

相关函数
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
功能:完成指定描述符集合中有效描述符的动态检测。
该函数具有阻塞等待功能,在函数执行完毕后
目标测试集合中将只保留最后有数据的描述符。
参数:nfds 描述符的上限值,一般是链接后描述符的最大值+1;
readfds 只读描述符集
writefds 只写描述符集
exceptfds 异常描述符集
以上三个参数都是 fd_set * 的描述符集合类型
timeout 检测超时 如果是NULL表示一直检测不超时 。
返回值:超时 0
失败 -1
成功 >0
辅助函数
为了配合select函数执行,有如下宏函数:
void FD_CLR(int fd, fd_set *set);
功能:将指定的set集合中编号为fd的描述符号删除。
int FD_ISSET(int fd, fd_set *set);
功能:判断值为fd的描述符是否在set集合中,
如果在则返回真,否则返回假。
void FD_SET(int fd, fd_set *set);
功能:将指定的fd描述符,添加到set集合中。
void FD_ZERO(fd_set *set);
功能:将指定的set集合中所有描述符删除

注意事项:
1 . select 函数会修改readfds 集合。如果是循环调用select ,需要清除标志位。
2. nfds 进程中最大文件描述的那个整数。 可以直接写1024;
3. select如果是超时版本,在调用select前,都需要重新设置时间。
4 select 集合最大检测 1024个

二、epoll 使用步骤

相关函数
int epoll_create(int size);
功能:创建一个集合(二叉树) ,存续需要被检测的文件描述符。
参数:size ,指定集合可以储存文件描述符的个数。
返回值:
成功 >0 表示对应二叉树的文件描述符( 用于表示某个资源)
失败 -1
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:对epoll 集合进行相关的操作,具体操作由op 指定。
参数:
epfd,需要被操作的集合
op :
EPOLL_CTL_ADD ,向集合中添加文件描述符
EPOLL_CTL_DEL ,向集合中删除文件描述符
fd ,需要 添加或删除的那个文件描述符
event , 结构体 ,
struct epoll_event {
uint32_t events; EPOLLIN(read)/EPOLLOUT(write)
特征:
服务器的并发模型
进程版本
epoll_data_t data; 用户自定义的数据,查找文件描述符的时候会使用到
};
返回值:
成功 ==0
失败 -1
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int
timeout);
功能: 等待io事件(可能是读,写,错误)的到来。
参数:
epfd,需要被检测的集合
events: 这个是输出的集合,当有io设备准备就绪(可读,可写)。系统会把这些设备对应的文件描述符,复
制到这个集合中。
maxevents, 在一次检测中,可以同时复制到events 中的 数量。
timeout 是超时值的设置。 -1 阻塞
5000 == 5s
0 非阻塞
返回值:
成功 >0
超时 ==0
失败 -1

特征:
1 . 存储文件描述符集合的个数,不再受1024 限制
2 .检测机制是 主动上报 ,不会随着文件描述的增多,而效率下降
3 。使用共享内存,避免集合在用户层和内核层 多次复制。
4. 当epoll_wait 返回后,准备就绪的文件描述符都储存在 events 集合中,相对容易

http://www.jsqmd.com/news/467404/

相关文章:

  • 光伏电池建模及仿真:探索PV曲线与IV曲线的奥秘
  • 2026年上海热门的别墅座椅电梯厂家,Uzin优行值得选吗 - 工业设备
  • 2026做轻量化单兵无人机系统比较好的公司有哪些推荐?猎翼无人机的飞行体验 - 品牌2026
  • 阿里云轻量服务器搭建 WireGuard (wg-easy) 指南
  • DevOps技术面试指南:容器、云原生与内核核心问题
  • ACWing 3497 质数
  • 浙江润鑫轴线车无线汽车称重仪:智能无线传输,称重检测一步到位 - 速递信息
  • 【操作系统学习日记】《现代处理器性能的三重奏:ISA架构、流水线与缓存系统》
  • 基于C# WinForm的PLC通讯上位机开发之旅:Modbus协议与SQL 2008的融合
  • 探索微观孔隙建模插件:开启多领域模拟的新大门
  • 【LeetCode】1. 两数之和(Two Sum)— 哈希表经典题解(C语言)
  • ESP32-S3 基础介绍
  • 探索 COMSOL 中含裂缝地层的流动与传热耦合模拟:油藏数值模拟实战
  • 基于二进制粒子群算法的配电网故障诊断—Matlab 应用选取配电网故障诊断,采用二进制粒子群优化算法
  • 自动药片装瓶机的“神经中枢“是如何炼成的
  • CPU_多线程操作图片_代码详解
  • 纯电动汽车动力经济性仿真:Cruise 与 Simulink 联合之旅
  • 【教学类-133-01】20260309狮虎旗(井字棋)01豆包初稿HTML+ CSS + JavaScript
  • 西门子200smart模拟量处理:滤波与报警的完美结合
  • 从DeepSig RadioML 2018.01A到定制化数据集:单信噪比单调制数据的提取与实战应用
  • 玩转PLC液体混合作业线(附全套工业组态方案)
  • 性价比优先:预算低情景下自动化立体仓库公司的选型指南 - 品牌策略主理人
  • Claude Code Hooks 实战:8大事件与10+脚本的自动化开发指南
  • STM32四轴联动运动控制:直线圆弧插补技术,编码器反馈与加减速控制,原理图和源代码全解析
  • 猎翼无人机,提升探测效率:2026军用目标识别无人机蜂群系统供应商推荐 - 品牌2026
  • 探索风光储交流微网中的双向储能变流器
  • 【小龙虾-OpenClaw】Railway如何部署小龙虾-OpenClaw
  • Hutool StrUtil 实战技巧:提升Java字符串处理效率
  • PAT-Broken Keyboard (20)
  • api接口