从语义上讲,为什么epoll_wait在读取端关闭后向我发送EPOLLIN



这个问题很简单。在read返回zero之后,在套接字上调用了shutdown(..., SHUT_RD)epoll_wait不断向我发送套接字的EPOLLIN事件。我知道在我的情况下,我可以也必须调用epoll_ctl来修改事件掩码。天真的想法让我想到,如果closeepoll列表中删除了记录,那么shutdown必须标记适当的套接字端。

问题是,语义上,既然read返回的0套接字因读取而关闭,为什么epoll_wait报告我的读取可用?

如果尝试从套接字读取会立即返回而不是阻塞,则

epoll_wait()将报告EPOLLIN

一旦执行了shutdown(..., SHUT_RD);,所有对read()的调用都会立即返回0。由于它不会阻塞,epoll_wait()报告套接字是可读的。

它在语义上也是合理的。例如,如果您收到EPOLLIN | EPOLLRDHUP并成功读取其中的数据(因为您的对等方同时发送了数据和FIN(,则可能不会关闭连接。但是,如果没有发送新的事件,您将错过关闭连接的唯一机会。在这种情况下,重复的EPOLLIN事件会有所帮助。

最新更新