3
man select

错误

在 Linux 下,select() 可能会将套接字文件描述符报告为“准备好读取”,但随后会出现读取块。例如,当数据到达但检查时校验和错误并被丢弃时,可能会发生这种情况。可能存在文件描述符被虚假报告为就绪的其他情况。因此,
在不应阻塞的套接字上使用 O_NONBLOCK 可能更安全。

但是我看到netcat,,socatwget但不是curl)将没有 O_NONBLOCK 的 FD 用于选择或轮询。

我已经实现了一个特殊的库来测试应用程序,但它们失败了......

/* 灵感来自于看到一个来自陈旧套接字的挂起wget并且read没有像它应该的那样超时 */

我应该将此报告为错误还是他们做得对?

可能的答案:

  1. “不,在 poll/select => bug 中阻塞 FD”;
  2. “只有 AF_INET[6] 套接字在选择时可能会失火,因此只有在阻塞网络套接字处于轮询/选择中时才会出现错误”;
  3. “是的,仅当/当您因此而看到实际失败时才报告错误”(例如在 wget 中)。
4

0 回答 0