Я хотел бы написать приложения C / C++ и предоставить им API для прямой связи с управляемыми systemd службами. Фактически, я бы хотел, чтобы мои приложения могли выполнять эквивалент systemctl start service_name@unit_number.service без использования вызовов system(), popen() или exec() (жесткое требование).
Есть ли API просто C / C++ для связи с systemd, при условии, что systemd версии 219 (то есть CentOS v7.4, также жесткое требование)?
systemd, на C / C++ и нашел странное обсуждение по теме, но не нашел хороших примеров.systemctl версия 219 из исходников, но тогда я потенциально мог нарушить лицензию GPL.libsystemd только для конкретных целей, и я, по-видимому, не первый, кто поднимает эту проблему.systemd v219.system() / popen() / exec() не обращаются к утилите systemctl CLI.Есть ли более простой API, который я мог бы использовать в CentOS v7.4 (даже если я должен сам предоставить общую библиотеку), который можно использовать для связи с systemd простым и надежным способом напрямую через код C / C++? Если существующий API libdbus-1.so сложен, но все же надежен, и я могу создать на его основе надежную / стабильную библиотеку-оболочку, я готов изучить этот вариант. Кроме того, если возможно вручную собрать и развернуть компоненты SD-BUS независимо от systemd и использовать их без необходимости изменять / обновлять библиотеку / демон systemd, уже находящиеся в системе, я потенциально мог бы пойти по этому пути.
Спасибо.
@ rm5248 Я был бы открыт для использования зрелой библиотеки C++, если она не требует полного выпуска всего исходного кода. Спасибо!
Поскольку API-интерфейс systemd представлен как набор интерфейсов D-Bus, этот вопрос по существу сводится к «какие привязки C / C++ D-Bus вы рекомендуете?», Который рассматривается в этот существующий ответ вместе с их плюсами и минусами.





Как вы уже поняли, вы должны взаимодействовать с systemd только с помощью библиотеки dbus, другого поддерживаемого способа для этого нет. Даже если вы отменили требование об отсутствии выполнения двоичных файлов, оно останется неодобрительным, поскольку инструменты * ctl представляют собой командную строку пользовательские интерфейсы, не предназначенную или предназначенную для вызова из других программ.
Вы также поняли, что это обычная проблема, и новый API «SD Bus» ее решает. Как вы думаете, почему существует безболезненный старый API, когда они сделали блестящий новый API менее болезненным?
Действительно рекомендуется использовать sd-bus ... но из C++ в значительной степени единственный зрелый, хорошо протестированный и хорошо поддерживаемый вариант, который у него есть, - это qtdbus.
Вы изучали возможность использования библиотеки-оболочки C++? Уже существует несколько, которые упрощают использование библиотеки dbus.