首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sd_bus_get_property_string等价于gdbus?

sd_bus_get_property_string等价于gdbus?
EN

Stack Overflow用户
提问于 2020-03-12 18:06:30
回答 1查看 596关注 0票数 0

我尝试读取带有gdbus/glib-2.0的systemd单元的gdbus属性。对于sd总线来说,存在着方便的功能sd_bus_get_property_string.如果使用gdbus,等效调用是什么?我知道gdbus introspect命令,但我需要在C/C++中实现它。

我已经开始和停止单位了。现在,我需要验证一个单元是否已成功启动/停止。我是新来的dbus,已经在网上搜索了几个小时的例子,找不到有用的东西。

EN

回答 1

Stack Overflow用户

发布于 2020-03-16 08:02:13

我还在C++中实现了一些系统功能。这是我的解决方案:

代码语言:javascript
复制
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;
}

从这里,你可以打电话给

代码语言:javascript
复制
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是如何在这些上下文中使用的是很好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60659673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档