目标
我想编写C/C++应用程序,并为它们提供API,以便它们直接与systemd
管理的服务通信。实际上,我希望我的应用程序能够执行相当于systemctl start service_name@unit_number.service
的操作,但不能使用system()
、popen()
或exec()
调用(硬性要求)。
问题
是否有一个与 systemd
通信的简单的 C/C++ API,假设 systemd
版本为219(即 CentOS v7.4,同时是硬性要求)?
目前的工作
- 我在网上搜寻了控制C/C++中systemd管理服务的例子,发现只有零星的讨论,但没有找到好的例子。
- 我可以反向工程
systemctl
版本219的源代码, 但这可能会违反GPL许可证。 - 由于我被困在CentOS v7.4中,因此无法使用新的“SD Bus”API的221或更高版本。 没有人会为了一个特定的应用程序的利益而允许手动升级
libsystemd
,而且我显然不是第一个提出这个问题的人。 - 我不愿意使用低级别的C API来处理DBUS,因为维护者自己都说“如果你直接使用这个低级别的API,你就要面对一些痛苦。”
硬性要求
systemd
v219。- CentOS v7.4
- C/C++。
- 不使用
system()
/popen()
/exec()
调用systemctl
CLI实用程序。 - 非传播许可证(即LGPLv2可以,但首选BSD/MIT)。
问题(Redux)
在CentOS v7.4上,我能否使用更简单的API(即使需要自己提供共享库)以一种简单可靠的方式直接通过C / C ++代码与systemd
通信? 如果现有的libdbus-1.so
API过于复杂但仍然可靠,并且我可以创建一个可靠/稳定的包装器库,我愿意探索这个选项。 此外,如果可以手动构建和部署SD-BUS组件而不必修改/升级系统上已有的systemd
库/守护程序,则我也可能采用这种方法。
编辑和评论
- 我愿意使用成熟的C++库,只要它不需要完全释放所有源代码。
谢谢。