epoll有两种触发模式:水平触发(LT)和边缘触发(ET)。
- 水平触发(LT):这是epoll的默认工作模式。在这种模式下,只要被监控的文件描述符还有数据可以读取或者还能写入数据,就会一直通知该事件。也就是说,如果你没有处理完所有的数据,那么每次调用epoll的时候,它都会响应这个事件。只有你读或写到了EAGAIN,也就是没有更多的数据可以处理了,那么它在下一次epoll调用的时候才不会响应。
- 边缘触发(ET):在这种模式下,当被监控的文件描述符状态发生变化时,epoll只会通知一次该事件,直到该文件描述符的状态再次发生变化为止。也就是说,如果你没有处理完所有的数据或没有处理该事件,那么在下一次epoll调用的时候,它不会再响应这个事件。
ET模式比LT模式效率更高,因为它避免了多次响应同一个事件,但使用ET模式需要更小心,因为如果你没有处理完所有的数据或没有处理该事件,那么可能会丢失数据。在使用ET模式时,我们通常会使用非阻塞IO,这样我们可以尽可能的读取或写入所有的数据,直到收到EAGAIN错误为止。