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