IO多路复用(select, epoll)
来源:互联网 发布:全国教师网络培训平台 编辑:程序博客网 时间:2024/06/04 17:42
在Linux系统编程中,会遇到一个进程处理多个IO问题,例如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
由于read为阻塞模式, 如果2个read 写在一个循环中, 当出现键盘阻塞时,无法读取鼠标信息.
要解决问题可以在打开时设置非阻塞模式 open(“”, O_RDONLY | O_NONBLOCK); 但这样做极占CPU.
所以要同时处理多路IO时, 我们用select, epoll来解决问题.
select
select()要引入头文件 sys/select.h,功能:“让程序能够监控文件描述符,直到文件描述符的I/O事件变成就绪状态,也就是文件描述符变成可读写。”
在看select前,要了解2个结构体类型:
fd_set是 sys/select.h 中定义的 文件描述符集合结构体
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
timeval是 sys/time.h 中定义的 时间结构体:
- 1
- 2
- 3
- 4
- 5
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set **exceptfds, struct timeval *timeout);
返回值:就绪描述符的数目,超时返回0,出错返回-1
1.第一个参数: 最大的文件描述符+1
2.中间的三个参数readset、writeset和exceptset指定读、写和异常条件的描述字。如果对某一个的条件不感兴趣,可以设置NULL。fd_set定义的集合,可通过以下四个宏进行设置:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.第三个参数是超时时间。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
epoll
epoll分为LT水平触发模型和ET边沿触发模型
LT模型类似于原来的select/poll操作,只要事件还没有处理完就会一直通知直到处理为止.
ET模型当套接字“状态发生变化”时候触发一次通知.
epoll只有3个函数:
int epoll_create(int size);
返回值:返回一个epoll的epfd操作句柄,内部是个RB-Tree,占用一个fd,所以不用了需要close。
参数:size用来告诉内核这个fd监听的数目一共有多大,在Linux 2.6.8后这个参数已经忽略了,传值时大于0即可。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
返回值:成功返回0,失败返回-1,设置errno。
参数:epfd: epoll_create的返回值,epoll句柄。
op: 操作宏,有EPOLL_CTL_ADD、EPOLL_CTL_MOD、EPOLL_CTL_DEL
fd : 要操作的fd
event:要监控的事件
struct epoll_event结构如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
events可以是以下几个宏的集合:
EPOLLIN:表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
返回值:>0 就绪的fd数目,0 没有fd就绪, -1 错误并设置errno
参数: epfd epoll_create的返回值
events 就绪events集合
maxevents 集合大小
timeout 超时时间
- IO多路复用(select, epoll)
- IO多路复用(select poll epoll)
- IO多路复用:select、poll、epoll
- IO多路复用总结:select pool epoll
- IO多路复用之select poll epoll
- linux网络编程 IO多路复用 select epoll
- IO多路复用之select、poll以及epoll
- IO多路复用之select、poll、epoll详解
- IO 多路复用之 select、poll、epoll 详解
- IO多路复用:select、poll、epoll示例
- io多路复用之select,poll,epoll总结
- IO多路复用 --select、poll、epoll模式
- IO多路复用select,poll,epoll的区别
- IO多路复用--select和epoll详解
- IO多路复用之select、poll、epoll详解
- IO多路复用:select,poll,epoll的区别
- IO多路复用之select、poll、epoll详解
- IO多路复用之select、poll、epoll详解
- java异常处理
- windows10系统下win键失效
- QSysInfo获取操作系统的相关信息
- php 实例方法总结
- Windows系统下的TCP参数优化
- IO多路复用(select, epoll)
- python开发环境配置
- 【java web spring mvc】服务端 微信支付+微信异步通知【精】
- Redis持久化:RDB和AOF配置和对比
- 微信开发准备(一)--Maven仓库管理新建WEB项目
- Instructions on EINT configuration ffor MT6589/MT6572/MT6582/MT6592/MT6571 platforms
- chromium源码下载方法(不用vpn)
- 工具类总结(3)-MD5 加盐加密工具类
- Fresco加载图片