如果我没有设置EPOLLOUT事件并直接调用write()函数怎么办?

时间:2018-08-08 23:50:20

标签: c++ c sockets epoll

我有EPOLLIN事件,仅用于读取数据。在不设置EPOLLOUT事件的情况下直接写入数据是否可以?

1 个答案:

答案 0 :(得分:1)

在将epoll与级别触发的通知一起使用时,您会在套接字上获得恒定的EPOLLOUT通知,除了短暂的时间段内套接字的输出缓冲区实际上已满。这样的影响是,即使您没有要发送的内容,也没有数据要接收,您的事件循环也会唤醒。

要解决这个问题,您有两个实际选择:

  1. 禁用EPOLLOUT,直到您实际获得EWOULDBLOCK / EAGAIN为止。此时,您启用EPOLLOUT,并在发送完成后再次将其禁用。

  2. 启用边缘触发的通知,并始终保持启用EPOLLOUT。现在,只有当系统从输出缓冲区已满状态变为未满状态时,您才会收到EPOLLOUT通知。但是,EPOLLIN现在也被边沿触发,这意味着您只有一个EPOLLIN通知,直到耗尽输入缓冲区为止。

在注释中,向您提供了第三个选项,以实现您自己的轮询循环,以处理具有完整输出缓冲区的套接字。可以这样做,但不是必须这样做,因为epoll可以告诉您什么时候可以写。

相关问题