POLLHUP 与 POLLRDHUP?
POLLHUP vs. POLLRDHUP?
根据poll man page,poll函数可以return POLLHUP和POLLRDHUP事件。
据我了解,只有 POLLHUP 是 POSIX 兼容的,而 POLLRDHUP 是 Linux 非标准扩展。但是,两者似乎都表示连接的写入端已关闭,所以我不明白 POLLRDHUP 相对于 POLLHUP 的附加值。
有人可以解释一下两者之间的区别吗?
不,当 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
。当接收到FIN
包时设置RCV_SHUTDOWN
,当FIN
包被另一端确认时设置SEND_SHUTDOWN
,套接字移动到[=23] =]状态。
[除了 TCP_CLOSE
部分,该片段被所有协议复制;并且整个事情对于 unix 套接字等的工作方式类似]
还有其他重要区别 -- POLLRDHUP
(不同于 POLLHUP
)必须在 .events
中明确设置才能在 .revents
中返回。
而POLLRDHUP
只适用于套接字,不适用于fifos/pipes或ttys。
根据poll man page,poll函数可以return POLLHUP和POLLRDHUP事件。 据我了解,只有 POLLHUP 是 POSIX 兼容的,而 POLLRDHUP 是 Linux 非标准扩展。但是,两者似乎都表示连接的写入端已关闭,所以我不明白 POLLRDHUP 相对于 POLLHUP 的附加值。 有人可以解释一下两者之间的区别吗?
不,当 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
。当接收到FIN
包时设置RCV_SHUTDOWN
,当FIN
包被另一端确认时设置SEND_SHUTDOWN
,套接字移动到[=23] =]状态。
[除了 TCP_CLOSE
部分,该片段被所有协议复制;并且整个事情对于 unix 套接字等的工作方式类似]
还有其他重要区别 -- POLLRDHUP
(不同于 POLLHUP
)必须在 .events
中明确设置才能在 .revents
中返回。
而POLLRDHUP
只适用于套接字,不适用于fifos/pipes或ttys。