继讨论之后 如何在单个事件循环中同时使用 AIO 和 epoll?.

事实上,Linux 中有 2 个“aio”API。有 POSIX aio(aio_* 系列函数),包含在我相信由 RedHat(?)开发的 glibc 和 libaio 中,io_* 系列。

第一个允许通过 aio_sigevent aiocb 成员注册通知请求。这可以轻松地与 ppoll()/pselect() 事件循环集成。如果你想将 POSIX aio 与 epoll() 集成,那么你需要将信号转换为虚拟 fd 上的事件(可能是管道)并使用 epoll 监听它,同时以经典方式或使用 ppoll/ 捕获信号选择。第一选择(普通的叹息者)的安全性取决于应用。也许在 epoll 上,但我不完全了解它的内部结构。我可以放心地假设,如果我有一个基于 epoll 的应用程序,并且我想添加 POSIX aio 支持,那么我就完蛋了?这是我的问题。

第二个 AIO 实现 libaio - 实际上可以与 eventfd() 一起使用(struct iocb 具有预计为零的 aio_resfd 成员或将 AIO 结果传递到的 eventfd)。但这不是书本上的。也就是说,POSIX 指定的。

我梦想自己成为一个一切都清晰的 *BSD 用户。您拥有对 AIO 事件的 POSIX AIO 和 kqueue() 支持。晶莹剔透。就像许多其他事情一样。

有帮助吗?

解决方案

请注意,您可以将 POSIX aio 与 epoll 一起使用,有 signalfd(2) 它创建一个文件描述符,然后您可以使用它来接收基于 epoll 的循环中的信号通知。

另外,第二个 aio API 应该最终是 glibc 的 POSIX aio 实现的基础,只是还没有完全实现......(也不知道有没有人在做)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top