POLLHUP与POLLRDHUP?

时间:2019-05-16 21:52:42

标签: linux epoll

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

1 个答案:

答案 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_MASKRCV_SHUTDOWN|SEND_SHUTDOWN。收到RCV_SHUTDOWN数据包时设置FIN,而另一端确认SEND_SHUTDOWN数据包并且套接字移至{{1 }}状态。

[除了FIN部分,该代码段已被所有协议复制;并且整个操作对于unix套接字等类似。

还有其他重要区别-FIN-WAIT2(与TCP_CLOSE不同)必须在POLLRDHUP中进行显式设置才能在POLLHUP中返回。

.events仅适用于套接字,不适用于fifos /管道或ttys。