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

4
我正在使用epoll通过HTTP协议向服务器写入大量数据。 fds都被设置为非阻塞状态,并且我正在使用边缘触发事件。我知道对于EPOLLIN,我需要循环读取fd直到返回EAGAIN。对于写入,如果我得到了EAGAIN,我不确定是否应该继续循环,还是等待epoll通知fd再次可用于读取。
例如,我正在编写一条20K的消息,第一次::写入尝试时发送的数据量= 13K。下一次尝试写入返回retVal = -1和errno = EAGAIN。
此时,我应该在while(1)中继续循环直到可以写入数据,还是应该等待epoll在FD再次准备好写入时调用我的回调函数? 我的理解是,由于fd已注册为可写入,因此当FD再次准备好写入时,epoll应该通知我。但在我的程序中似乎并没有发生这种情况。
我需要设置特殊标志或修改FD以获得通知吗?
1个回答

7
在这种情况下,我应该继续在 while(1) 循环中等待直到可以写入数据吗?
不需要!
还是说我应该等待 epoll 在 FD 再次准备好写入时调用我的回调函数呢?
是的,你应该这样做(但是什么回调函数?epoll_wait 没有回调机制,它只是返回)。
我理解的是,由于 fd 已经被注册为可写,当 FD 再次准备好写入时 epoll 应该通知我。但是在我的程序中似乎没有发生这种情况。
如果 FD 被注册了 EPOLLOUT 或者 EPOLLIN | EPOLLOUT,则确实应该通知。你能否提供一个简单的例子来说明问题?

James,谢谢回复。我的代码有一个bug - 这就是为什么我再次准备写入时没有收到fd上的EPOLLET事件。现在它已经按预期工作了。 - user1290156

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接