【发布时间】:2018-11-19 16:05:35
【问题描述】:
目标
我想编写 C/C++ 应用程序并为它们提供 API 以直接与 systemd 托管服务进行通信。实际上,我希望我的应用程序能够在不使用 system()、popen() 或 exec() 调用的情况下执行 systemctl start service_name@unit_number.service 的等效操作(硬性要求)。
问题
是否有简单 C/C++ API 用于与systemd 通信,假设systemd 219 版(即CentOS v7.4,也是硬性要求) ?
到目前为止工作
- 我在网上搜索了在 C/C++ 和 found the odd discussion on the topic 中控制
systemd托管服务的示例,但没有找到任何好的示例。 - 我总是可以对
systemctlversion 219 from source 进行逆向工程,但我可能会违反 GPL 许可。 -
Since I'm stuck with CentOS v7.4, which means I can't get at version 221 or later of systemd, I can't use the newer "SD Bus" API.Nobody would allow manually upgrading
libsystemdjust for an application-specific benefit, and I'm apparently not the first person to raise this concern. - I'm hesitant to use the low-level C API for DBUS,因为维护者自己声明“如果你直接使用这个低级 API,你注册会有些痛苦。”。
硬性要求
-
systemdv219。 - CentOS v7.4
- C/C++。
- 没有
system()/popen()/exec()调用systemctlCLI 实用程序。 - 非传播许可证(即 LGPLv2 也可以,但首选 BSD/MIT)。
问题(Redux)
是否有一个更简单的 API 可以在 CentOS v7.4 上使用(即使我必须自己提供共享库),它可以用于直接通过 C/C++ 以简单、可靠的方式与systemd 通信代码? 如果现有的 libdbus-1.so API 很复杂但仍然可靠,并且我可以围绕它创建一个可靠/稳定的包装库,我愿意探索该选项。另外,如果可以手动构建并部署独立于 systemd 的 SD-BUS 组件并使用它们,而无需修改/升级系统上已有的 systemd 库/守护进程,我也可能走这条路。
编辑和评论
- 我愿意使用成熟的 C++ 库,只要它不需要全部发布所有源代码。
谢谢。
【问题讨论】:
-
您是否考虑过使用 C++ 包装库?已经存在一些使 dbus 库更易于使用的工具。
-
@rm5248 我愿意使用成熟的 C++ 库,只要它不需要全部发布所有源代码。谢谢!
-
由于 systemd API 是作为一组 D-Bus 接口公开的,所以这个问题基本上可以归结为“你推荐什么 C/C++ D-Bus 绑定?”——@987654326 涵盖了这一点@,以及它们的优缺点。
标签: c linux service systemd dbus