Python:select.POLLHUP

Python:select.POLLHUP,python,python-3.x,select,Python,Python 3.x,Select,我在Ubuntu上使用select.poll和一个套接字,并注册了POLLIN、POLLERR和POLLHUP 我的理解是,当POLLIN事件发生且recv()不返回任何数据时,表示对等方已断开连接。我的测试似乎证实了这一点 但是为什么我不能得到POLLHUP?这有不同的语义吗 事件值是位图 如果你得到POLLIN(值:1),你就有东西要读, 如果您得到POLLHUP(值:16),则输入结束, 所以当你得到POLLIN(1)&POLLHUP(16)=17,这意味着你的输入结束了,你还有一些东西要

我在Ubuntu上使用select.poll和一个套接字,并注册了POLLIN、POLLERR和POLLHUP

我的理解是,当POLLIN事件发生且recv()不返回任何数据时,表示对等方已断开连接。我的测试似乎证实了这一点


但是为什么我不能得到POLLHUP?这有不同的语义吗

事件值是位图

如果你得到POLLIN(值:1),你就有东西要读,
如果您得到POLLHUP(值:16),则输入结束,
所以当你得到POLLIN(1)&POLLHUP(16)=17,这意味着你的输入结束了,你还有一些东西要从缓冲区中读取

读取缓冲区中的所有内容后,每次调用poll()时只会单独获得POLLHUP:
在这种情况下,在轮询列表中保留文件描述符是没有用的,

最好立即注销此文件描述符。

可能会有帮助。@Barmar谢谢。非常好的参考资料。