Epoll的两种工作模式
LT模式(水平触发)
假设委托内核检测读事件-检测fd的读缓冲区
都缓冲区有数据-epoll检测到了会给用户通知
- 用户不读数据,数据一直在缓冲区,epoll会一直通知
- 用户只读了一部分数据,epoll会通知
- 缓冲区的数据读完了,不通知
LT模式是默认的工作模式,同时支持阻塞和非阻塞套接字两种模式。
内核告诉你一个文件描述符是否就绪,然后你可以对这个就虚的fd进行IO操作,如果你不做任何操作的话,内核还是会继续通知你。(只要是缓冲区内有数据,内核就通知)。
ET模式(边沿触发)
假设委托内核检测读事件-检测fd的读缓冲区
都缓冲区有数据-epoll检测到了会给用户通知
- 用户不读数据,数据一直在缓冲区,epoll不通知
- 用户只读了一部分数据,epoll不通知
- 缓冲区的数据读完了,不通知
只支持非阻塞套接字。当描述符变为就绪时,内核会通过EPOLL告诉你。然后他会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知。除非文件描述符又重回非就绪态。
如何设置ET模式
struct epoll_event{
__uint32_t events;
epoll_data_t data;
}
可能出现的错误:
EINTR:被某进程中断。
EAGAIN:fd被标志位非阻塞,数据以读完如果再读的话,会返回EAGAIN。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)