我正在使用epoll使用HTTP协议将大型消息写入服务器。 fds都设置为非阻塞,我正在使用边缘触发事件。我知道对于EPOLLIN我需要循环读取fd,直到返回EAGAIN。对于写作,我不确定一旦得到EAGAIN我是否应该继续循环,或者我应该等待epoll在fd可以再次读取时通知。
例如,我正在写一个20K的消息,并且在第一次:: write尝试时发送的数据量= 13K。下一次写入尝试将返回retVal = -1和errno = EAGAIN。
此时我应该继续循环一段时间(1)直到我可以写入数据,或者我应该等待epoll在FD准备再次写入时调用我的回叫。我的理解是,由于fd已经注册写入,epoll应该在FD准备好再次写入时通知我。但这似乎并没有发生在我的计划中。
我是否需要设置特殊标志或修改FD以获取通知?
答案 0 :(得分:5)
此时我应该继续循环(1)直到我可以写入数据
没有!
或者我应该等到epoll在FD准备好再次写入时调用我的回叫。
是的,你应该(但回调是什么?epoll_wait
没有回调机制,它只是返回)
我的理解是,由于fd已经注册为写作,epoll应该在FD准备再次写入时通知我。但这似乎并没有发生在我的计划中。
如果FD已在EPOLLOUT
或EPOLLIN | EPOLLOUT
注册,则确实如此。你能提供一个证明这个问题的小例子吗?