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