这个问题很简单。在read
返回zero
之后,在套接字上调用了shutdown(..., SHUT_RD)
。epoll_wait
不断向我发送套接字的EPOLLIN
事件。我知道在我的情况下,我可以也必须调用epoll_ctl
来修改事件掩码。天真的想法让我想到,如果close
从epoll
列表中删除了记录,那么shutdown
必须标记适当的套接字端。
问题是,语义上,既然read
返回的0
套接字因读取而关闭,为什么epoll_wait
报告我的读取可用?
epoll_wait()
将报告EPOLLIN
。
一旦执行了shutdown(..., SHUT_RD);
,所有对read()
的调用都会立即返回0
。由于它不会阻塞,epoll_wait()
报告套接字是可读的。
它在语义上也是合理的。例如,如果您收到EPOLLIN | EPOLLRDHUP
并成功读取其中的数据(因为您的对等方同时发送了数据和FIN
(,则可能不会关闭连接。但是,如果没有发送新的事件,您将错过关闭连接的唯一机会。在这种情况下,重复的EPOLLIN
事件会有所帮助。