根据 poll函数手册页,poll函数可以返回POLLHUP和POLLRDHUP事件。据我所知,只有POLLHUP符合POSIX标准,而POLLRDHUP是Linux非标准扩展。然而,两者都似乎表示连接的写端已关闭,因此我不理解POLLRDHUP相对于POLLHUP的附加价值。请问有人能解释一下两者之间的区别吗?
poll()
对套接字进行轮询时,POLLHUP
会发出信号表明连接在双向上已关闭。shutdown(SHUT_WR)
或此端调用shutdown(SHUT_RD)
时,将设置POLLRDHUP
,但在另一个方向上的连接仍可能存活。net/ipv4/tcp.c
。 if (sk->sk_shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
mask |= EPOLLHUP;
if (sk->sk_shutdown & RCV_SHUTDOWN)
mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
SHUTDOWN_MASK
是RCV_SHUTDOWN|SEND_SHUTDOWN
。当接收到FIN
数据包时,设置RCV_SHUTDOWN
;当另一端应答一个FIN
数据包且套接字进入FIN-WAIT2
状态时,设置SEND_SHUTDOWN
。
[除了TCP_CLOSE
部分外,该片段被所有协议复制; 该整个过程对Unix套接字等也适用]
还有其他重要的区别-必须在.events
中明确设置POLLRDHUP
(与POLLHUP
不同),以便在.revents
中返回。
而POLLRDHUP
仅适用于套接字,而不适用于FIFO /管道或TTY。