在http://linux.die.net/man/2/select上,在BUGS部分,提到选择系统调用有时可以虚假地设置FD就绪,随后的读取调用将返回0.文本描述了一个这样的例子(错误的校验和)但我假设还有其他原因(否则他们会解决这个问题).
任何想法可能导致另一个原因选择返回FD准备虚假.
这是否也适用于其他操作系统.我目前正在询问Linux.
上述链接的相关部分:
在Linux下,select()可以将套接字文件描述符报告为"准备好读取",而不是后续的读取块.这可能例如在数据到达时发生但在检查时具有错误的校验和并被丢弃.可能存在其他情况,其中虚假地报告文件描述符为就绪.因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全.
我有一个用于从select()读取的信号套接字,但是后来没有数据通过recv call()到达,而是返回-1并且errno == EAGAIN.
我可以授予没有其他线程触及套接字.
我认为这种行为是不正确的.如果从其他方面发生后续关闭,我可以期待返回值0(正常关闭)或来自recv的其他错误代码,但不是EAGAIN,因为这意味着我认为数据将来会到达.
我发现这个问题以前的一些线程在这里,但没有解决方案.
在Ubuntu Linux Oneric或其他最新的Linux发行版上发生了这种行为,然后在此处发布链接信息
对于3.0.0内核或最新的2.6.x,它将在内核中修复
有没有人知道它为什么会发生以及如何避免这种不必要的行为?