似乎不能将常规文件的写入/读取设为非阻塞。我找到了以下支持参考:
来自 Linux 编程接口:Linux 和 UNIX 系统编程手册:
"--- 非阻塞模式可用于设备(例如,终端和伪终端)、管道、FIFO 和套接字。(因为管道和套接字的文件描述符不是使用 open() 获得的,我们必须使用 fcntl 启用此标志() F_SETFL 操作在 5.3 节中描述。) O_NONBLOCK 通常对常规文件被忽略,因为内核缓冲区缓存确保常规文件上的 I/O 不会阻塞,如 13.1 节所述。但是,O_NONBLOCK 确实对常规文件有影响使用强制文件锁定时的文件(第 55.4 节)。---"
来自 UNIX 环境中的高级编程第 2 版:
"--- 我们也说过,与磁盘 I/O 相关的系统调用并不被认为是慢的,即使磁盘文件的读取或写入会暂时阻塞调用者。---"
来自http://www.remlab.net/op/nonblock.shtml:
“--- 常规文件总是可读的,它们也总是可写的。这在相关的 POSIX 规范中明确说明。我不能强调这一点。将常规文件置于非阻塞状态除了更改一位之外绝对没有任何影响文件标志。从常规文件中读取可能需要很长时间。例如,如果它位于繁忙的磁盘上,I/O 调度程序可能需要很长时间,以至于用户会注意到应用程序被冻结。然而,非-阻塞模式不起作用。它根本不起作用。检查文件的可读性或可写性总是立即成功。如果系统需要时间来执行 I/O 操作,它将使任务进入不可中断的睡眠状态或编写系统调用。---"
当内存足够可用时,通过内核缓冲执行读/写。
我的问题是:是否存在内核内存不足导致缓冲无法立即使用的情况?如果是,内核会做什么?只是返回一个错误或做一些惊人的技巧?
多谢你们!