写入文件描述符时的epoll行为

时间:2012-03-24 16:04:55

标签: epoll

我正在使用epoll使用HTTP协议将大型消息写入服务器。 fds都设置为非阻塞,我正在使用边缘触发事件。我知道对于EPOLLIN我需要循环读取fd,直到返回EAGAIN。对于写作,我不确定一旦得到EAGAIN我是否应该继续循环,或者我应该等待epoll在fd可以再次读取时通知。

例如,我正在写一个20K的消息,并且在第一次:: write尝试时发送的数据量= 13K。下一次写入尝试将返回retVal = -1和errno = EAGAIN。

此时我应该继续循环一段时间(1)直到我可以写入数据,或者我应该等待epoll在FD准备再次写入时调用我的回叫。我的理解是,由于fd已经注册写入,epoll应该在FD准备好再次写入时通知我。但这似乎并没有发生在我的计划中。

我是否需要设置特殊标志或修改FD以获取通知?

1 个答案:

答案 0 :(得分:5)

  

此时我应该继续循环(1)直到我可以写入数据

没有!

  

或者我应该等到epoll在FD准备好再次写入时调用我的回叫。

是的,你应该(但回调是什么?epoll_wait没有回调机制,它只是返回)

  

我的理解是,由于fd已经注册为写作,epoll应该在FD准备再次写入时通知我。但这似乎并没有发生在我的计划中。

如果FD已在EPOLLOUTEPOLLIN | EPOLLOUT注册,则确实如此。你能提供一个证明这个问题的小例子吗?