C poll()是否可以在对等机挂起后返回POLLIN事件?

C poll()是否可以在对等机挂起后返回POLLIN事件?,c,linux,multithreading,sockets,poll-syscall,C,Linux,Multithreading,Sockets,Poll Syscall,我看到poll()系统调用返回POLLIN事件,即使在对等方关闭套接字之后也是如此。我看到POLLIN和POLLERR都在拍摄。即使在read()调用返回-1之后,这种情况仍然会发生 只有在没有POLLIN的情况下,我的逻辑才会处理POLLERR,以确保我读取了套接字断开连接之前已经到达的任何数据包。因此,我永远不会处理POLLERR,因为POLLIN总是被设置的 为什么poll()在套接字错误后返回POLLIN和POLLERR? 我应该如何处理这种情况 谢谢 这里真正的问题是,为什么您仍在对套

我看到poll()系统调用返回POLLIN事件,即使在对等方关闭套接字之后也是如此。我看到POLLIN和POLLERR都在拍摄。即使在read()调用返回-1之后,这种情况仍然会发生

只有在没有POLLIN的情况下,我的逻辑才会处理POLLERR,以确保我读取了套接字断开连接之前已经到达的任何数据包。因此,我永远不会处理POLLERR,因为POLLIN总是被设置的

为什么poll()在套接字错误后返回POLLIN和POLLERR? 我应该如何处理这种情况


谢谢

这里真正的问题是,为什么您仍在对套接字进行轮询,实际上,为什么套接字仍然存在?如果从
read()
获得-1,则应该关闭套接字并将其从轮询集中删除。如果不这样做,
POLLIN
将永远重复出现。

我有一个异步模型,其中调度程序线程保持轮询,并将工作项发布到工作线程以执行实际读取。工作线程仅读取并重新启用轮询。我依靠轮询器来检测错误并处理它们。如果有POLLERR,我可能不应该处理任何事件。但作为一个普遍的问题,为什么民意调查会返回波林和波勒?这难道不意味着在有套接字错误的情况下有数据要读取吗?@siri:人们使用
poll()
的一个主要原因是,他们不必向工作线程分派IO。为什么不让同一个线程执行
poll()
recv()
send()
?我希望有一组线程可以同时在多个连接上工作。由于它们都不能进行轮询,我最终设计了一个调度程序线程进行轮询,工作线程在准备就绪的套接字上执行IO?这样做的一般模式是什么?@siri:典型的异步设计可能有一个线程完成所有IO,并将缓冲区来回传递给工作线程。但如果我想让一组线程在不同的连接上并行执行IO怎么办?如果同一轮询线程需要执行读写操作,多个线程是否可以调用轮询?