我尝试用/读出systemd 单元ActiveState
的属性。对于sd-bus有方便的功能。如果使用gdbus ,等效的调用会是什么。我知道该命令,但我需要在 C/C++ 中实现它。gdbus
glib-2.0
sd_bus_get_property_string
gdbus introspect
我已经设法启动和停止单位。现在我需要验证一个单元是否已成功启动/停止。我是 dbus 的新手,并且已经在互联网上搜索了几个小时的示例,但没有找到有用的东西。
我尝试用/读出systemd 单元ActiveState
的属性。对于sd-bus有方便的功能。如果使用gdbus ,等效的调用会是什么。我知道该命令,但我需要在 C/C++ 中实现它。gdbus
glib-2.0
sd_bus_get_property_string
gdbus introspect
我已经设法启动和停止单位。现在我需要验证一个单元是否已成功启动/停止。我是 dbus 的新手,并且已经在互联网上搜索了几个小时的示例,但没有找到有用的东西。
我还在 C++ 中实现了一些 systemd 的东西。这是我的解决方案:
std::string Unit::GetPropertyString(const std::string& property) const
{
sd_bus_error err = SD_BUS_ERROR_NULL;
char* msg = nullptr;
int r;
r = sd_bus_get_property_string(m_bus,
"org.freedesktop.systemd1",
("/org/freedesktop/systemd1/unit/" + m_unit).c_str(),
"org.freedesktop.systemd1.Unit",
property.c_str(),
&err,
&msg);
if (r < 0)
{
std::string err_msg(err.message);
sd_bus_error_free(&err);
std::string err_str("Failed to get " + property + " for service "
+ m_name + ". Error: " + err_msg);
throw slib_exception(err_str);
}
sd_bus_error_free(&err);
// Free memory (avoid leaking)
std::string ret(msg);
free (msg);
return ret;
}
从此,您可以致电
activestate = GetPropertyString("ActiveState");
substate = GetPropertyString("SubState");
我发现很多<systemd/sd-bus.h>
没有很好的记录。作者在这里有一个奇妙的解释:http:
//0pointer.net/blog/the-new-sd-bus-api-of-systemd.html
但除了他给出的几个例子之外,我发现检查源代码更容易。具体来说,我发现查看systemctl
和journalctl
应用程序的源代码以了解sd-bus
在这些上下文中是如何使用的。