Linux上的AIO支持

dor*_*ron 2 c c++ linux aio

有谁知道在哪里可以获得有关最新Linux内核上aio内核支持状态的最新信息?Google搜索会显示可能无可救药地过时的网页.

编辑:

更具体地说,我对非文件相关的描述符如管道和套接字感兴趣.网上的东西表明没有支持,这仍然是这样吗?

Edit2:我正在寻找的东西类似于Windows OVERLAPPED IO

Amb*_*jak 5

您不需要POSIX AIO(即man aio)异步使用套接字和管道.根据man 3 aio它甚至不可能.您应该使用非阻塞文件描述符与替代,一起事件通知接口,如select(),poll()epoll.epoll是特定于Linux的,但比前两个更好.

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

fcntl(fd, F_SETFL, O_NONBLOCK)
Run Code Online (Sandbox Code Playgroud)

文件描述符处于非阻塞模式后,I/O操作类似于read()并且write()永远不会阻塞,但会返回EAGAIN或者EWOULDBLOCK如果操作无法立即完成.某些更具体的操作,例如connect(),必须以非阻塞模式以不同的方式使用; 请参阅相关手册页.

为了能够正确使用非阻塞文件descritors,您的应用程序需要是事件驱动的.基本上,main()你需要首先初始化东西,然后进入事件循环.事件循环重复等待事件(例如epoll_wait(),使用事件通知接口),然后检查发生了哪些事件,并响应它们.

现在当你说a read(),并且它失败时EWOULDBLOCK,你将它添加到文件描述符列表中,以便于阅读; 当事件提供者指示可读性时,您再试一次.

同样,如果您尝试write()并且失败EWOULDBLOCK,您可能希望缓冲数据并在指示可写性时再次尝试.