【问题标题】:Non blocking file descriptors Unix Network Programming非阻塞文件描述符 Unix 网络编程
【发布时间】:2009-11-14 16:24:50
【问题描述】:

我想问什么情况下我们需要在文件/套接字描述符上使用非阻塞标志,这意味着我们总是可以使用 select 函数调用来确定就绪描述符。这是对 Unix Network Programming V1 第 16.2 节中的程序的引用。在那个程序中,为什么作者在 3 个描述符 stdin、stdout、socket 上设置非阻塞标志。他还说 EWOULDBLOCK 永远不会发生。但他也说时间从 12.3 秒减少到 6.9 秒。

【问题讨论】:

  • 并非我们所有人都有这本书。请描述正在测量哪些程序的运行时间——以及在什么样的系统上。
  • 在 Unix 上,他测量文件的传输基本上是一个回显客户端。
  • 什么类型的 Unix 和使用了什么硬件?我问这个是因为我怀疑差异可能与程序各自的控制流有关,而不是与系统调用的开销有关。
  • 不,它与硬件/软件无关。它是一个一般概念。我只是在问为什么当该描述符未准备好时我会调用 read(我通过 select() 知道),所以如果该描述符已准备好(由 FD_ISSET 返回),我无论如何都不会阻塞。

标签: unix network-programming


【解决方案1】:

文件:

打开需要一些时间来使用非阻塞 FD(又名 O_NONBLOCK)初始化的设备(例如调制解调器)非常有用。这不仅适用于调制解调器,还适用于许多需要自行构建以适合使用的字符设备,或者设备可能在因其他原因发出“准备就绪”信号之前阻塞的情况。

各种 QRNG(量子随机数生成器)也需要此标志,以及必须在发出“准备就绪!”信号之前寻找对等点的各种类型的照明控制器。

此外,由于某些用户空间文件系统提供了一个 已知 阻塞几秒钟的 ioctl() 接口.. 您可能希望也可能不希望在其中传递非阻塞 FD情况,取决于您允许的时间对睡眠的有害程度。

套接字:

当您希望使用非阻塞 I/O 而单线程“管家”往往会处理许多客人时。这里的一个常见误解是认为 block free 意味着 lock free 以某种神秘的方式。它没有。事实上,任何一个通常都排斥另一个。

【讨论】:

  • 我在问使用选择/设置非阻塞标志之间的区别。
  • 有一些简单的应用吗?你提到了复杂的应用程序。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多