在http://linux.die.net/man/2/select的 BUGS 部分下,提到 select 系统调用有时可能会虚假地将 FD 设置为就绪,随后的 read 调用将返回 0。文本描述了一个这样的示例(错误的校验和)但我假设也会有其他原因(否则他们会解决这个问题)。
任何想法可能导致 Select 虚假返回 FD 就绪的其他原因。
这是否也适用于其他操作系统。我目前正在询问Linux。
上面链接的相关部分:
在 Linux 下,select() 可能会将套接字文件描述符报告为“准备好读取”,但随后会出现读取块。例如,当数据到达但检查时校验和错误并被丢弃时,可能会发生这种情况。可能存在文件描述符被虚假报告为就绪的其他情况。因此,在不应阻塞的套接字上使用 O_NONBLOCK 可能更安全。