将 sd_bus 包裹在单个文件描述符中
Wrap sd_bus in single file descriptor
我正在编写一个将在后台使用 sd_bus 的库。我的目标是
- 允许集成到任何现有的主循环中(不要强迫客户做出选择)
- 稳定的 ABI
- 以后添加更多内部事件源的能力(更多套接字等)
- 隐藏 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()
获得表示它的文件描述符,以用于外部事件循环。
我正在编写一个将在后台使用 sd_bus 的库。我的目标是
- 允许集成到任何现有的主循环中(不要强迫客户做出选择)
- 稳定的 ABI
- 以后添加更多内部事件源的能力(更多套接字等)
- 隐藏 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()
获得表示它的文件描述符,以用于外部事件循环。