POLLHUP和POLLRDHUP有什么区别?

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

这意味着远程端对套接字进行了部分关闭,不会再发送任何数据,但仍然可以接收。 - Shawn
@Shawn 当你说“它”时,你是指POLLHUP而不是POLLRDHUP吗?还是指POLLRDHUP而不是POLLHUP?或者你是指它们都表示这个意思?或者其他什么意思? - David Schwartz
@Shawn,表示FIFO的文件描述符是否会设置POLLRDHUP? - Guett31
@Barmar,删除套接字已关闭读取的指示是它已确认我们的 FIN 数据包。 - user10678532
@Guett31 不,对于FIFO不会设置POLLRDHUP。 - user10678532
显示剩余4条评论
1个回答

9
不,使用poll()对套接字进行轮询时,POLLHUP会发出信号表明连接在双向上已关闭。
当另一端调用shutdown(SHUT_WR)或此端调用shutdown(SHUT_RD)时,将设置POLLRDHUP,但在另一个方向上的连接仍可能存活。
您可以查看内核源代码中的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数据包且套接字进入FIN-WAIT2状态时,设置SEND_SHUTDOWN

[除了TCP_CLOSE部分外,该片段被所有协议复制; 该整个过程对Unix套接字等也适用]

还有其他重要的区别-必须在.events中明确设置POLLRDHUP(与POLLHUP不同),以便在.revents中返回。

POLLRDHUP仅适用于套接字,而不适用于FIFO /管道或TTY。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接