io - 为什么 Posix 文件 I/O 总是阻塞?
问题描述
从手册页
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.
根据我的问题,我对 io 系统有了以下了解。
Device <-----> Kernel Buffers <-----> Process
因此,每当缓冲区满(写)或空(读)时,来自进程的相应命令可以阻塞或不阻塞,具体取决于上面的标志。与设备交互的内核不会阻塞进程。内核可能会也可能不会使用 DMA 与设备进行通信。
但看起来我的理解是错误的,因为我看不出为什么常规文件描述符不能是非阻塞的。有人可以在这里帮助我吗?
解决方案
“阻塞”被定义为等待文件变得可读或可写。
常规文件始终是可读和/或可写的;换句话说,总是可以尝试启动读/写操作而不必等待一些外部事件:
- 读取时,内核已经知道文件中是否还有更多字节(如果已到达文件末尾,则无法阻塞等待其他进程追加更多字节);
- 写入时,内核已经知道磁盘上是否有足够的空间来写东西(如果磁盘已满,则无法阻塞等待其他进程删除一些数据以释放空间)。
推荐阅读
- apache - 树莓派上的 apache 使用 system() 调用 bash 脚本不会写入文件
- node.js - 弹性搜索 match_all 过滤器仅在指定大小时返回所有文档
- c++ - 输入验证帮助 - 将额外输入添加到下一个变量
- java - 如何从地图中的标记获取纬度和经度
- javascript - 如何有效地实现 addEventListener?
- sql-server - 如果查询没有结果,如何返回消息但如果有结果则显示结果?
- c++ - 为什么在 C++ 中允许重新声明模板成员函数?
- jasper-reports - 检查报告中时间戳的空值
- makefile - 交叉编译时出错 shared so 依赖于另一个 so
- python - 在 Kubernetes 中使用 PySpark 解压和使用外部模块