首页 > 解决方案 > POLLHUP 与 POLLRDHUP?

问题描述

根据poll 手册页,poll 函数可以返回 POLLHUP 和 POLLRDHUP 事件。据我了解,只有 POLLHUP 符合 POSIX,而 POLLRDHUP 是 Linux 非标准扩展。但是,两者似乎都表明连接的写入端已关闭,因此我不了解 POLLRDHUP 优于 POLLHUP 的附加值。有人能解释一下两者之间的区别吗?

标签: linuxepoll

解决方案


不,当poll()ing 一个套接字时,将在两个方向上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_SHUTDOWNRCV_SHUTDOWNFIN接收到数据包SEND_SHUTDOWN时设置,当FIN数据包被另一端确认时设置,并且套接字移动到FIN-WAIT2状态。

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

还有其他重要的区别—— POLLRDHUP(不像POLLHUP)必须明确设置.eventsin 才能在.revents.

并且POLLRDHUP仅适用于套接字,不适用于 fifos/管道或 ttys。


推荐阅读