水平触发(LT)

如果文件描述符已经就绪可以非阻塞执行 IO 操作了,此时会触发通知,允许在任意时刻重复检测 IO 的状态,SELECT,POLL 就属于水平触发

另外一种描述:如果文件描述符上可以非阻塞地执行I/O系统调用,此时认为它已经就绪,触发通知

边缘触发(ET)

如果该文件描述符自上次状态改变后有新的 IO 活动到来,此时触发通知,在收到一个 IO 事件通知后要尽可能多执行 IO 操作,因为如果在一次通知中没有执行完 IO 操作那么就要等待下一次新的 IO 活动到来才能获取状态描述符

另外一种描述:如果文件描述符自上次状态检查以来有了新的I/O活动(比如新的输入),此时需要触发通知

在边沿触发下,一个socket有500的数据,已读取200然后不再处理,是不是剩下的300就永远无法读取?

是的,在这个模式下,如果不把剩下的数据一次性读完,socket 将永远不可读。

各自触发条件

水平触发只要 socket 处于 readable/writable 状态,无论什么时候进行 epoll_wait 都会返回该 socket 。

边缘触发情况下,只有 socket 从 unreadable 变为 readable 或从 unwritable 变为 writable 时,epoll_wait 才会返回该 socket