linux 从语义上讲,为什么epoll_wait在read end关闭后向我发送EPOLLIN?

b5buobof  于 2023-03-29  发布在  Linux
关注(0)|答案(2)|浏览(109)

问题很简单。shutdown(..., SHUT_RD)read返回zero后在套接字上被调用。epoll_wait不断向我发送套接字的EPOLLIN事件。我知道我可以,也必须这样做,在我的情况下,调用epoll_ctl来修改事件掩码。天真的想法让我认为,如果closeepoll列表中删除记录,则shutdown必须标记适当的套接字结束。
问题是,语义上,为什么epoll_wait报告我读可用,给定***read返回的0套接字被关闭以阅读***?

f45qwnt8

f45qwnt81#

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

zu0ti5jz

zu0ti5jz2#

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

相关问题