从语义上讲,为什么 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
来修改事件掩码。天真的想法让我认为,如果 close
从 epoll
列表中删除记录,那么 shutdown
必须标记适当的套接字结束。
问题是,语义上,为什么 epoll_wait
报告我有可用的阅读,鉴于 read
返回 0
socket were shutdown for reading?
epoll_wait()
将报告 EPOLLIN
如果尝试从套接字读取会立即 return 而不是阻塞。
一旦您执行 shutdown(..., SHUT_RD);
所有对 read()
return 0
的调用立即。由于它不会阻塞,epoll_wait()
报告套接字可读。
问题很简单。在 read
返回 zero
之后,在套接字上调用了 shutdown(..., SHUT_RD)
。 epoll_wait
不断向我发送套接字的 EPOLLIN
事件。
我知道我可以而且必须这样做,在我的情况下,调用 epoll_ctl
来修改事件掩码。天真的想法让我认为,如果 close
从 epoll
列表中删除记录,那么 shutdown
必须标记适当的套接字结束。
问题是,语义上,为什么 epoll_wait
报告我有可用的阅读,鉴于 read
返回 0
socket were shutdown for reading?
epoll_wait()
将报告 EPOLLIN
如果尝试从套接字读取会立即 return 而不是阻塞。
一旦您执行 shutdown(..., SHUT_RD);
所有对 read()
return 0
的调用立即。由于它不会阻塞,epoll_wait()
报告套接字可读。