将 sd_bus 包裹在单个文件描述符中

Wrap sd_bus in single file descriptor

我正在编写一个将在后台使用 sd_bus 的库。我的目标是

  1. 允许集成到任何现有的主循环中(不要强迫客户做出选择)
  2. 稳定的 ABI
  3. 以后添加更多内部事件源的能力(更多套接字等)
  4. 隐藏 sd_bus 作为实现细节

我的想法是使用一个 epoll 文件描述符,我将在其中添加 sd_bus 文件描述符以及我将来拥有的任何其他文件描述符。然后我的客户可以将这个 epoll 文件描述符挂接到他们的主循环中。我将公开一个类似于 sd_bus_process 的函数,客户端可以在 epoll 文件描述符激活时调用该函数。

一个挑战是 sd_bus 需要在每次睡眠之间更改其 fd、超时和观看事件(sd_bus_get_fd、sd_bus_get_events、sd_bus_get_timeout)。为了获得灵感,我查看了 systemd 代码库中的 sd_event 实现,以及来自 Lennart Poettering 的 this email

我正在考虑向我的 epoll 组添加一个额外的 timerfd。然后我可以在将控制权交还给客户端之前调整 timerfd 的超时时间,并且我可以使用普通的 epoll 调用调整总线 fd 上的监视事件。客户端只会看到一个只需要监视 POLLIN 事件的 fd。

是否有 better/standard 方法来做到这一点?或者我的想法似乎合理?

如果您已经链接到 libsystemd,只需使用 real sd-event 模块。它已经与 sd-bus 正确集成,并且在内部是 epoll-based,因此您可以通过 sd_event_get_fd() 获得表示它的文件描述符,以用于外部事件循环。