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

最佳答案

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

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

  • 禁用EPOLLOUT,直到您实际获得EWOULDBLOCK/EAGAIN为止。届时,您将启用EPOLLOUT,并在发送完成后再次将其禁用。
  • 启用边缘触发的通知,并始终启用EPOLLOUT。现在,仅当系统从输出缓冲区已满状态更改为未满状态时,您才会收到EPOLLOUT通知。但是,现在EPOLLIN也同样被边沿触发,这意味着您只有一个EPOLLIN通知,直到耗尽输入缓冲区。

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

    关于c++ - 如果我没有设置EPOLLOUT事件并直接调用write()函数怎么办?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51757113/

    10-08 21:29