linux - POLLHUP 与 POLLRDHUP?
问题描述
根据poll 手册页,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_MASK
是RCV_SHUTDOWN|SEND_SHUTDOWN
。RCV_SHUTDOWN
当FIN
接收到数据包SEND_SHUTDOWN
时设置,当FIN
数据包被另一端确认时设置,并且套接字移动到FIN-WAIT2
状态。
[除了TCP_CLOSE
部分,该片段被所有协议复制;并且整个事情对于unix套接字等都类似]
还有其他重要的区别—— POLLRDHUP
(不像POLLHUP
)必须明确设置.events
in 才能在.revents
.
并且POLLRDHUP
仅适用于套接字,不适用于 fifos/管道或 ttys。
推荐阅读
- c# - WPF 异步加载 UI 元素
- scala - 如何在 spark scala 中检查与其关联的列名和数据是否匹配
- java - Android 本机应用程序 - 如何获取类 android.view.view 中的文本
- go - 嵌套结构的 stringer 函数
- c - 函数指针背后的原因是c语言中的函数名本身?
- python - 使用 PROMPT_COMMAND 时,Python venv 模块无法将虚拟环境名称添加到 PS1?
- python - 与交叉熵损失相比,为什么蒸馏损失不收敛(减少)?
- java - 字符串到 Json 转义嵌套 json 中的正斜杠
- javascript - 如何使用javascript在浏览器(safari)中询问音频自动播放权限
- php - 如何在 PHP 中识别数组中的不匹配元素