gpt4 book ai didi

linux - "readable"(kqueue/epoll)由什么构成

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:59 24 4
gpt4 key购买 nike

我知道,如果远程主机优雅地关闭连接,epoll将报告EPOLLIN,并且调用readrecv不会阻塞,并且将返回0字节(即流结束)。

但是,如果连接未正常关闭,并且 writesend 操作失败,这是否会导致 epoll 随后为该套接字返回 EPOLLIN,从而产生相同/相似的流结束场景?

我试图找到有关此行为的文档,但没有成功,虽然我可以测试它,但我对具有特定内核版本的特定发行版上发生的情况不感兴趣。

最佳答案

从规范中确实不完全明显,但它对于 poll() 的工作原理如下:

  • 如果有数据可供读取,即使连接关闭,也会返回 POLLIN
  • 如果由于连接关闭而无法读取或写入,则返回 POLLHUPPOLLERR
  • 如果无法再读取,但可以写入(例如对方shutdown(SHUT_WR)),则返回 POLLIN,但不返回 POLLHUPPOLLERR。 (这允许正常等待POLLOUT。)

简单的做法是在设置了 POLLINPOLLHUPPOLLERR 中的任何一个时尝试读取。

kqueue()中,只有一个EVFILT_READ过滤器可以被触发。这在手册页中有描述,应该足够清楚。

请注意,如果您不启用 TCP keepalive(FreeBSD 默认启用它们,但大多数其他操作系统不启用),如果网络以某些方式中断,则等待数据读取可能会永远卡住。即使 TCP keepalive 开启,也往往需要几个小时才能检测到断开的连接。

关于linux - "readable"(kqueue/epoll)由什么构成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665694/

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