我有EPOLLIN事件,仅供读取数据。在不设置EPOLLOUT事件的情况下直接写入数据是否可以?
最佳答案
当将epoll
与级别触发的通知一起使用时,您将在套接字上获得恒定的EPOLLOUT
通知,除了套接字的输出缓冲区实际上已满的短暂时间之外。这样的影响是,即使您没有要发送的内容,也没有数据要接收,您的事件循环也会唤醒。
为了解决这个问题,您有两个实际选择:
EPOLLOUT
,直到您实际获得EWOULDBLOCK
/EAGAIN
为止。届时,您将启用EPOLLOUT
,并在发送完成后再次将其禁用。 EPOLLOUT
。现在,仅当系统从输出缓冲区已满状态更改为未满状态时,您才会收到EPOLLOUT
通知。但是,现在EPOLLIN
也同样被边沿触发,这意味着您只有一个EPOLLIN
通知,直到耗尽输入缓冲区。 在注释中,向您提供了第三个选项,以实现您自己的轮询循环,以处理具有完整输出缓冲区的套接字。这可以使它起作用,但不是必须的,因为
epoll
可以告诉您什么时候可以写。关于c++ - 如果我没有设置EPOLLOUT事件并直接调用write()函数怎么办?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51757113/