【问题标题】:revisiting "how do you use aio and epoll together"重温“如何同时使用 aio 和 epoll”
【发布时间】:2010-01-31 22:08:28
【问题描述】:

关注How do you use AIO and epoll together in a single event loop? 的讨论。

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

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

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

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

【问题讨论】:

    标签: posix epoll aio kqueue


    【解决方案1】:

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

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

    【讨论】:

    • 你能举个例子来使用 signalfd(2) 与 POSIX aio 和 epoll(select, poll) 结合,因为结构 siginfo_t 有成员 si_value 而结构signalfd_siginforeturn 通过读取signalfd 没有对应的成员ssi_value,当posix aio 通过读取signalfd 完成时,我怎样才能得到si_value
    猜你喜欢
    • 2010-12-21
    • 2019-10-13
    • 1970-01-01
    • 2017-06-21
    • 2011-08-16
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多