水平触发和边缘触发

水平触发

  • 读事件:如果 epoll_wait 触发了读事件,表示有数据可读,如果程序没有把数据读完,再次调用 epoll_wait 的时候,将立即再次触发读事件。
  • 写事件:如果发生缓冲区没有满,表示可以写入数据,只要缓冲区没有被写满,再次调用epoll_wait的时候,将立即再次触发写事件。

边缘触发

  • 读事件:如果 epoll_wait 触发了读事件,不管程序有没有处理读事件,epoll_wait 都不会再触发读事件,只有当新的数据到达时,才再次触发读事件。
  • 写事件:epoll_wait 触发写事件之后,如果发送缓冲区任可以写(发送缓冲区没有满),epoll_wait 不会再次触发写事件,只有当发送缓冲区由 满 变成 不满 时,才再次触发写事件。

实例说明

这里就以读事件举例,客户端发生长度为 6 的字符串sssbbb,服务器这边一次读只能读取长度为 3 的字符串。下面看看水平触发和边缘触发的现象:

水平触发:epoll_wait触发读事件,读取字符串sss,epoll_wait再次触发读事件,读取字符串bbb

边缘触发:epoll_wait触发读事件,读取字符串sss

客户端再次发送长度为6的字符串sssbbb:

水平触发:epoll_wait触发读事件,读取字符串sss,epoll_wait再次触发读事件,读取字符串bbb

边缘触发:epoll_wait触发读事件,读取字符串bbb(把之前没读完的字符串读完)

实践效果图如下:

水平触发.png

边缘触发.png