繁体   English   中英

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

[英]Wrap sd_bus in single file descriptor

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

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

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

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

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

有没有更好/标准的方法来做到这一点? 还是我的想法似乎合理?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM