基于 DBusGProxy 连接 dbus 信号失败

Posted

技术标签:

【中文标题】基于 DBusGProxy 连接 dbus 信号失败【英文标题】:Failed to connect dbus signal based on DBusGProxy 【发布时间】:2012-05-25 15:43:29 【问题描述】:

我正在做一个小项目。我的操作系统是 Linux (Ubuntu 11.04)。我想连接到 DBus Daemon 信号 NameOwnerChanged 以指示哪个应用程序正在关闭或启动。我编写了一个小程序来执行此操作。虽然失败了。我只使用了 glib dbus,没有使用 dbus lowlevel。

这是我的代码:

/gcc -o test main.c pkg-config --libs --cflags glib-2.0 dbus-1 dbus-glib-1/

#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-bindings.h>
#include <dbus/dbus-glib-lowlevel.h>

#define D_SERVICE     "org.freedesktop.DBus"
#define D_PATH        "/"
#define D_INTERFACE   "org.freedesktop.DBus"

GMainLoop* loop;
DBusGConnection* conn;
DBusGProxy*     d_proxy;

static void dbus_name_owner_changed(DBusGProxy *proxy, char* name, char* old, char* new, gpointer user_data)

    g_print("%s owner change \n", name);


int main(int argc,char** argv)

    g_type_init();
    loop = g_main_loop_new(NULL, FALSE);
    conn = dbus_g_bus_get(DBUS_BUS_SESSION,NULL);
    d_proxy = dbus_g_proxy_new_for_name(conn, D_SERVICE, D_PATH, D_INTERFACE);

    guint ret;
    GError * error = NULL;

    dbus_g_proxy_call(  d_proxy, "RequestName", &error,
                        G_TYPE_STRING, "com.asianux.test",
                        G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
                        G_TYPE_INVALID,
                        G_TYPE_UINT, &ret,
                        G_TYPE_INVALID);

    if(error==NULL && ret==DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
    
        g_print("Request Name Success \n");
    
    else
    
        if(error)
        
            g_print("Request Name Failed %s\n", error->message);
        
    

    dbus_g_proxy_add_signal(d_proxy,"NameOwnerChanged",
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_INVALID);

    dbus_g_proxy_connect_signal(d_proxy,"NameOwnerChanged",
                                G_CALLBACK(dbus_name_owner_changed),
                                NULL,NULL);

    g_main_loop_run(loop);

我编译并运行了它,但函数 dbus_name_owner_changed 从未运行过。为什么连接不上信号?

我知道在添加信号和连接信号之前我错过了dbus_g_object_register_marshaller。但是,即使我在代码中添加了dbus_g_object_register_marshaller,它仍然会失败。为什么?

【问题讨论】:

【参考方案1】:

我已经解决了。因为 D_PATH 应该是“/org/freedesktop/DBus”。

【讨论】:

以上是关于基于 DBusGProxy 连接 dbus 信号失败的主要内容,如果未能解决你的问题,请参考以下文章

无法释放内存

dbus会话连接:用qt槽连接dbus信号,怎么做?

e NetworkManager *** 连接的 dbus 信号处理程序

这个 Qt DBus 信号连接代码是不是正确?

无法取消注册 ble 通知的 dbus 信号

C DBus:调用方法返回字符串时失败