man select
错误
在 Linux 下,select() 可能会将套接字文件描述符报告为“准备好读取”,但随后会出现读取块。例如,当数据到达但检查时校验和错误并被丢弃时,可能会发生这种情况。可能存在文件描述符被虚假报告为就绪的其他情况。因此,
在不应阻塞的套接字上使用 O_NONBLOCK 可能更安全。
但是我看到netcat
,,socat
(wget
但不是curl
)将没有 O_NONBLOCK 的 FD 用于选择或轮询。
我已经实现了一个特殊的库来测试应用程序,但它们失败了......
/* 灵感来自于看到一个来自陈旧套接字的挂起wget
并且read
没有像它应该的那样超时 */
我应该将此报告为错误还是他们做得对?
可能的答案:
- “不,在 poll/select => bug 中阻塞 FD”;
- “只有 AF_INET[6] 套接字在选择时可能会失火,因此只有在阻塞网络套接字处于轮询/选择中时才会出现错误”;
- “是的,仅当/当您因此而看到实际失败时才报告错误”(例如在 wget 中)。