gpt4 book ai didi

linux - POLLHUP 与 POLLRDHUP?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:43 28 4
gpt4 key购买 nike

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

最佳答案

不,当 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_SHUTDOWN 在接收到 FIN 数据包时设置,而 SEND_SHUTDOWNFIN 数据包被确认时设置另一端,套接字进入 FIN-WAIT2 状态。

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

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

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

关于linux - POLLHUP 与 POLLRDHUP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56177060/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com