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_MASKRCV_SHUTDOWN|SEND_SHUTDOWN。当接收到FIN包时设置RCV_SHUTDOWN,当FIN包被另一端确认时设置SEND_SHUTDOWN,套接字移动到[=23] =]状态。

[除了 TCP_CLOSE 部分,该片段被所有协议复制;并且整个事情对于 unix 套接字等的工作方式类似]

还有其他重要区别 -- POLLRDHUP(不同于 POLLHUP)必须在 .events 中明确设置才能在 .revents 中返回。

POLLRDHUP只适用于套接字,不适用于fifos/pipes或ttys。