2012-03-24 79 views
1

我正在使用epoll将大型消息写入使用HTTP协议的服务器。 fds全部设置为非阻塞状态,我正在使用边缘触发的事件。我知道EPOLLIN我需要循环读取fd,直到EAGAIN返回。对于编写,我不确定一旦获得EAGAIN后是否应该继续循环,或者是否应该等待epoll通知fd何时可以再次读取。例如,我正在写一条20K的消息,并且在第一个::写入尝试中发送的数据量= 13K。下一次尝试写入将返回retVal = -1和errno = EAGAIN。写入文件描述符时的epoll行为

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

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

回答

4

在这一点上,我应该在一段时间(1)继续循环,直到我可以写数据

没有!

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

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

我的理解是,既然fd被注册写作,epoll的应该通知我当FD准备再次写入时。但是,这似乎并没有发生在我的程序中。

如果FD注册为EPOLLOUTEPOLLIN | EPOLLOUT,它应该的确如此。你能否提供一个证明问题的小例子?

+0

詹姆斯,谢谢你的回应。我在代码中存在一个错误 - 这就是为什么一旦它可用于再次写入时,我没有在fd上收到EPOLLET事件。它现在按预期工作。 – user1290156 2012-03-27 15:29:07