为什么选择使用epoll的ET模式

193 阅读1分钟

epoll的ET模式的优点

ET模式可以减少epoll_wait的提醒次数。

选择了ET就必须将socket设置为非阻塞

LT模式下,也就是阻塞io的情况下是不会使用while(1)去读取的,而是只读取一次,这个读取是在epoll_wait提示有可读事件下读取的,因此recv基本上不会阻塞的,如果没有读取完,每次epoll_wait都会提示这个socket上有数据没读取完,因此会最终把数据读取完,而数据读取完了之后,epoll_wait就不会再提示这个socket上的可读事件,除非这个socket再次有可读事件了,但是ET模式下,socket上出现了可读事件,他只提示一次,不管你有没有读完,因此我们需要一次性将所有可读的内容读出,所以就需要使用while(1),而使用while(1)的话,在读取完所有可读数据后,仍然会进入while循环继续使用recv读取,若此时socket是阻塞的,则程序会被阻塞在recv这,无法往下走,若socket是非阻塞的,则recv会直接返回-1,并设置errno,在while循环里处理这种情况就可跳出循环,让程序继续执行。