【问题标题】:Does a file descriptor used with POSIX AIO need to be opened with `O_NONBLOCK` in `open()`?与 POSIX AIO 一起使用的文件描述符是否需要在 `open()` 中使用 `O_NONBLOCK` 打开?
【发布时间】:2018-08-31 20:19:31
【问题描述】:

在使用带有文件描述符的 POSIX AIO 时,是否需要在 open() 中使用 O_NONBLOCK 打开文件描述符?

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

谢谢。

【问题讨论】:

  • 是什么让你认为它应该是? O_NONBLOCK 用于非阻塞 IO。 Linux 内核不支持 Btw AIO。
  • 简短的回答是“否”。您需要一个长答案吗?
  • @JonathanLeffler 是的。我不是很清楚他们的关系。
  • @Ivan - 你确定内核缺少 AIO 吗?我可以很容易地找到它的手册页;例如,AIO(7)。它在第 7 节杂项而不是第 3 节库函数下,这有点不寻常。
  • @jww Linux 有 io_setupio_getevents 等。但这些并没有实现 POSIX AIO 所需的一切。 aio_* 函数是在用户空间中实现的,因此它们是不一致的(例如,不是异步信号安全的)。

标签: c linux posix aio


【解决方案1】:

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

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

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

这些之间没有特别的关系。 POSIX 规范(如those for aio_read())和the Linux manual for the POSIX AIO interfaces 均未记录执行 AIO 的文件处于非阻塞模式的任何要求,也没有为处于阻塞模式的情况定义任何错误条件。非阻塞模式不是必需的。

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

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多