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

use*_*156 2 epoll

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

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

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

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

Jam*_*lin 5

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

没有!

或者,当FD准备再次写入时,我应该等待epoll调用我的回叫.

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

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

如果FD已注册EPOLLOUTEPOLLIN | EPOLLOUT,它确实应该注册.你能提供一个证明这个问题的小例子吗?