在How do you use AIO and epoll together in a single event loop?的讨论之后。
Linux中实际上有2个“aio”API。 有一个POSIX aio(aio_ *系列函数),包含在glibc和libaio开发中我相信RedHat(?),io_ *系列。
第一个允许通过aio_sigevent aiocb成员注册通知请求。这可以很容易地与ppoll()/ pselect()事件循环集成。如果你想将POSIX aio与epoll()集成,那么你需要将信号转换为虚拟fd(管道可能)上的事件并用epoll监听它,同时以经典方式或使用ppoll /捕获信号选择。第一选择(正常的sighandlers)的安全性取决于应用。也许在epoll上,但我并不完全了解它的内部结构。我可以安全地假设,如果我有一个基于epoll的应用程序,并且我想添加POSIX aio支持,那么我搞砸了?这是我的问题。
第二个AIO实现libaio - 可以与eventfd()一起使用(struct iocb具有aio_resfd成员,该成员预期为零或者eventfd用于提供AIO结果)。但这不是书。 POSIX指定,即。
我梦想自己是一个* BSD用户,一切都很清楚。您对AIO事件有POSIX AIO和kqueue()支持。晶莹剔透。像许多其他事情一样。
答案 0 :(得分:6)
请注意,您可以使用带有epoll的POSIX aio,signalfd(2)
它会创建一个文件描述符,然后您可以使用它来通知基于epoll的循环中的信号。
另外第二个aio API应该最终成为glibc基于它的POSIX aio实现的基础,它还没有完全存在......(我不知道是否有人正在研究它)