根据poll man page,poll函数可以返回POLLHUP和POLLRDHUP事件。 据我了解,只有POLLHUP是POSIX兼容的,而POLLRDHUP是Linux的非标准扩展。但是,两者似乎都表明连接的写端已关闭,因此我不了解POLLRDHUP相对于POLLHUP的附加值。 有人可以解释一下两者之间的区别吗?
答案 0 :(得分:0)
否,poll()
插入套接字时,POLLHUP
会发出信号,指示在两个方向都已关闭。
POLLRDHUP
将在另一端称为shutdown(SHUT_WR)
或此端称为shutdown(SHUT_RD)
时设置,但该连接在另一个方向上可能仍然有效。
您可以查看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
。收到RCV_SHUTDOWN
数据包时设置FIN
,而另一端确认SEND_SHUTDOWN
数据包并且套接字移至{{1 }}状态。
[除了FIN
部分,该代码段已被所有协议复制;并且整个操作对于unix套接字等类似。
还有其他重要区别-FIN-WAIT2
(与TCP_CLOSE
不同)必须在POLLRDHUP
中进行显式设置才能在POLLHUP
中返回。
.events
仅适用于套接字,不适用于fifos /管道或ttys。