[gdbus的sd_bus_get_property_string等效项?

问题描述 投票:0回答:1

我尝试用ActiveState / gdbus读出系统单位glib-2.0属性。对于sd-bus,存在便捷功能sd_bus_get_property_string。如果使用gdbus,将等效调用什么。我知道gdbus introspect命令,但需要在C / C ++中实现。

我已经设法启动和停止装置。现在,我需要验证一个单元是否已成功启动/停止。我是dbus的新手,已经在互联网上搜索了几个小时,但没有找到任何有用的信息。

properties systemd gdbus
1个回答
0
投票

我还用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

但是除了他给出的几个例子之外,我发现检查源代码更加容易。具体来说,我发现很好地查看systemctljournalctl应用程序的源代码,看看在这些上下文中如何使用sd-bus

© www.soinside.com 2019 - 2024. All rights reserved.