gpt4 book ai didi

c++ - Linux 上的 AIO 支持

转载 作者:太空狗 更新时间:2023-10-29 23:37:21 30 4
gpt4 key购买 nike

有谁知道我在哪里可以获得有关最新 Linux 内核对 aio 的内核支持状态的最新信息? Google 搜索显示的网页可能已经过时得无可救药了。

编辑:

更具体地说,我对非文件相关的描述符感兴趣,例如管道和套接字。网上说不支持,现在还这样吗?

编辑2:我要找的是类似于 Windows OVERLAPPED IO 的东西

最佳答案

您不需要 POSIX AIO(即 man aio)来异步使用套接字和管道。根据 man 3 aio 这甚至是不可能的。您应该改用非阻塞文件描述符,并结合事件通知接口(interface),例如select()poll() epollepoll 是特定于 Linux 的,但比前两者的扩展性要好得多。

要在非阻塞模式下使用文件描述符,您必须在每个文件描述符上设置 O_NONBLOCK 标志:

fcntl(fd, F_SETFL, O_NONBLOCK)

文件描述符处于非阻塞模式后,read()write() 等 I/O 操作将永远不会阻塞,但会返回 EAGAINEWOULDBLOCK 如果操作不能立即完成。一些更具体的操作,如connect(),必须在非阻塞模式下以不同的方式使用;请参阅相关手册页。

为了能够正确使用非阻塞文件描述符,您的应用程序需要 event driven .基本上,在 main() 中,您需要先初始化一些东西,然后进入事件循环。事件循环重复等待事件(使用事件通知接口(interface),例如 epoll_wait()),然后检查发生了哪些事件,并响应它们。

现在,当您调用 read() 时,它因 EWOULDBLOCK 而失败,您将其添加到可读性监视文件描述符列表中;当事件提供者指示可读性时,您再试一次。

类似地,如果您尝试 write() 而它因 EWOULDBLOCK 而失败,您可能需要缓冲数据并在指示可写性时重试。

关于c++ - Linux 上的 AIO 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956731/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com