水平触发和边缘触发
#网络编程
2024-08-10
水平触发
- 读事件:如果 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(把之前没读完的字符串读完)
实践效果图如下: