IO多路复用(IO多路转接)
1.多个IO复用一个进程
select
poll
epoll
1.创建文件描述符集合
2.添加文件描述符到集合中
3.通知内核开始检测
4.根据返回的结果做对应的操作(对IO读、写操作)
特点:
1.多个IO复用一个进程,不创建新的进程和线程,效率高
2.不适合处理比较耗时的任务
应用场景:
1.构建并发服务器,使用IO多路复用监测多个客户端套接字
2.使用IO多路复用监测多个IO所对应的通信(如:网络、串口、can...)
3.在阻塞IO中,进行超时监测
Linux下一切皆文件
select
检测多路IO
参数:
nfds 关注的文件描述符中的最大值加一(方便内核遍历查找)
readfds 关注的读事件的文件描述符集合
writefds 关注的写事件的文件描述符集合
exceptfds 其他(异常)
timeout 超时时间,如果不设置:NULL
返回值:
成功 返回内核通知的到达事件的个数
失败 返回-1
设置了超时时间,超时时间到达但没有事件 返回0
不足:
1.监听文件描述符最大个数为1024(数组) 时间复杂度(衡量效率):O(n)
2.监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据
3.需要循环遍历一次才能找到产生的事件
4.只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)
网络调试:
epoll
epoll_create
epoll_ctl
参数:
epfds 文件描述符集合句柄
op:
fd 操作的文件描述符
event 文件描述符所对应的事件
event EPOLLIN:读操作
EPOLLOUT:写操作
epoll_wait
监测IO事件
参数:
epfd 文件描述符集合句柄
events 保存到达事件的结合的首地址
maxevents 监测是事件的个数
timeout 超时时间
-1:表示不设置超时时间
返回值:
成功 返回到达事件的个数
失败 返回-1
设置超时:超时时间到达则返回0