EPOLL :epoll_create/epoll_ctl/epoll_wait
水平触发和边缘触发:使用水平触发的epoll和poll相同。
EPOLLET
1.管道的read端口rfd注册到epoll
2.管道的write端口写2K的数据
3.调用epoll_wait等待rfd资源可用
4.从rfd读1K的数据
5.再次调用epoll_wait
步骤5中调用的epoll_wait可能被阻塞,尽管输入buffer中的数据可以操作
ET只有在rfd的状态发生变化时才会触发事件。
①LT模式:Level Triggered水平触发
这个是缺省的工作模式。同时支持block socket和non-block socket。内核会告诉程序员一个文件描述符是否就绪了。如果程序员不作任何操作,内核仍会通知。
是一种高速模式。仅当状态发生变化的时候才获得通知。这种模式假定程序员在收到一次通知后能够完整地处理事件,于是内核不再通知这一事件。注意:缓冲区中还有未处理的数据不算状态变化,所以ET模式下程序员只读取了一部分数据就再也得不到通知了,正确的用法是程序员自己确认读完了所有的字节(一直调用read/write直到出错EAGAIN为止)。
An application that employs the EPOLLET flag should use non-blocking file descriptors to avoid having a blocking read or write starve a task that is handling multiple file descriptors.
The suggested way to use epoll as an edge-triggered (EPOLLET) interface is as follows:
i with non-blocking file descriptors; and
ii by waiting for an event only after read(2) or write(2) return EAGAIN.
如下图:
0:表示文件描述符未准备就绪
1:表示文件描述符准备就绪
对于水平触发模式(LT):在1处,如果你不做任何操作,内核依旧会不断的通知进程文件描述符准备就绪。
对于边缘出发模式(ET): 只有在0变化到1处的时候,内核才会通知进程文件描述符准备就绪。之后如果不在发生文件描述符状态变化,内核就不会再通知进程文件描述符已准备就绪。