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

Semantically, why does epoll_wait sends me EPOLLIN, after read end had been shut down?

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

问题是,语义上,为什么 epoll_wait 报告我有可用的阅读,鉴于 read 返回 0 socket were shutdown for reading?

epoll_wait() 将报告 EPOLLIN 如果尝试从套接字读取会立即 return 而不是阻塞。

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