首页 > 解决方案 > 与 POSIX AIO 一起使用的文件描述符是否需要在 `open()` 中使用 `O_NONBLOCK` 打开?

问题描述

将 POSIX AIO 与文件描述符一起使用时,是否需要使用O_NONBLOCKin打开文件描述符open()

O_NONBLOCK在 APUE 中,我没有发现它明确地说是或否,但我没有发现在open()一个示例中打开了这样的文件描述符。

感谢。

标签: clinuxposixaio

解决方案


由于您评论说您不清楚非阻塞 I/O 和异步 I/O 之间的关系和区别:

  • 以非阻塞模式打开的文件的 I/O 操作不会阻塞,即使没有数据可以立即传输。如果他们传输的数据少于请求的数据(或根本没有),那么如果他们愿意,则由调用者稍后再试。没有任何东西排队等待以后的操作。

  • POSIX AIO 接口提供了相对于调用者线程异步执行的 I/O 操作。AIO 调用在不等待 I/O 的情况下返回,而在不同的执行上下文中尝试该 I/O。调用者可以安排以各种方式通知操作完成(或不完成)。与此同时,它可以执行它想要的任何其他工作。

这些之间没有特别的关系。POSIX 规范(例如 POSIX 规范)aio_read()POSIX AIO 接口的 Linux 手册都没有记录执行 AIO 的文件处于非阻塞模式的任何要求,也没有定义任何错误条件在阻塞模式。非阻塞模式不是必需的。

实际上,尽管允许,但在非阻塞文件上执行 AIO 甚至不是特别有用。如果您可以依靠您的操作不阻塞,那么您从异步执行它中获得什么?AIO的要点是调用者不必等待,而是执行I/O。


推荐阅读