我有EPOLLIN事件,仅用于读取数据。在不设置EPOLLOUT事件的情况下直接写入数据是否可以?
答案 0 :(得分:1)
在将epoll
与级别触发的通知一起使用时,您会在套接字上获得恒定的EPOLLOUT
通知,除了短暂的时间段内套接字的输出缓冲区实际上已满。这样的影响是,即使您没有要发送的内容,也没有数据要接收,您的事件循环也会唤醒。
要解决这个问题,您有两个实际选择:
禁用EPOLLOUT
,直到您实际获得EWOULDBLOCK
/ EAGAIN
为止。此时,您启用EPOLLOUT
,并在发送完成后再次将其禁用。
启用边缘触发的通知,并始终保持启用EPOLLOUT
。现在,只有当系统从输出缓冲区已满状态变为未满状态时,您才会收到EPOLLOUT
通知。但是,EPOLLIN
现在也被边沿触发,这意味着您只有一个EPOLLIN
通知,直到耗尽输入缓冲区为止。
在注释中,向您提供了第三个选项,以实现您自己的轮询循环,以处理具有完整输出缓冲区的套接字。可以这样做,但不是必须这样做,因为epoll
可以告诉您什么时候可以写。