为什么Posix File I / O始终处于阻塞状态?

时间:2019-06-06 10:23:51

标签: io linux-kernel posix

摘自手册页

O_NONBLOCK or O_NDELAY  
        This flag has no effect for regular files and block
          devices; that is, I/O operations will (briefly) block when
          device activity is required, regardless of whether O_NONBLOCK
          is set.  Since O_NONBLOCK semantics might eventually be
          implemented, applications should not depend upon blocking
          behavior when specifying this flag for regular files and block
          devices.

my question起,我对io系统有了以下了解。

             Device <-----> Kernel Buffers <----->  Process

因此,每当缓冲区已满(写)或空(读)时,取决于上面的标志,来自进程的相应命令可能会阻塞还是不会阻塞。与设备交互的内核不会阻止该进程。内核可能会或可能不会使用DMA与设备进行通信。

但是似乎我的理解是错误的,因为我看不到为什么常规文件描述符不能不阻塞。有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

“阻止”定义为等待文件变得可读或可写。

常规文件始终可读和/或可写;换句话说,总是有可能尝试启动读/写操作,而不必等待某些外部事件:

  • 读取时,内核已经知道文件中是否还有更多字节(如果已经到达文件末尾,则不可能阻塞以等待其他进程追加更多字节);
  • 在写入时,内核已经知道磁盘上是否有足够的空间来写入内容(如果磁盘已满,则无法阻塞以等待其他进程删除某些数据以释放空间)。