epoll有两种触发模式 : 水平触发和边沿触发. 默认为水平触发模式.
水平触发
什么叫做水平触发呢? IO大都有缓冲区, 当缓冲区里面只要有数据时就会触发水平模式,直到将缓冲的数据读写结束才不会触发水平模式.
举个栗子 : 当我们现在的读缓冲区有1024字节的数据而我们每次都只能读一个字节, 那么一次读操作后缓冲区还有1023字节, 此时又继续触发水平模式继续读, 直到1024字节读完才不会触发水平模式.
因为默认是水平默认, 所以我们现在做的实验并容易引起大家的感觉. 实验代码只将服务端的buf[1024]改为了buf[2] ,完整代码epoll_default.c
客户端发送一串字符后也收到了完整的字符串. 运行结果 :
边沿触发
什么叫边沿触发呢? IO大都有缓冲区, 当缓冲区发生变化才会触发边沿模式.
举个栗子 : 我们每次都只能读一个字节. 当现在的读缓冲区增加到了1024字节的数据, 缓冲区有改变了那么触发边沿模式读一个字节, 操作后缓冲区还有1023字节. 但是现在缓冲区没有变化了, 所以不再触发边沿模式, 剩下的1023字节只有留在缓冲区中.
通过设置event
事件为EPOLLET才开启边沿触发.
只将服务端的buf[1024]改为了buf[2]并设置了EPOLLET.
完整代码 epoll_ET.c.
void doService(int servicefd)
{
char buf[2]; // 设置为2
while(