D-Bus GLib 绑定​​——无法让代码脱离实际

Posted

技术标签:

【中文标题】D-Bus GLib 绑定​​——无法让代码脱离实际【英文标题】:D-Bus GLib bindings—unable to get code off the ground 【发布时间】:2011-04-01 05:41:42 【问题描述】:

我一直在使用 GLib 的 D-Bus 绑定,试图让某些东西(anything)正常工作,但收效甚微。我一直在尝试让Ross Burton's example code 编译和运行,但不断遇到新的令人兴奋的困难。

您能否帮助调试此代码,或者如果失败了,请指出一些 D-Bus GLib 代码确实有效的示例?

由于罗斯的代码已经过时,我已经替换了这一行

dbus_g_object_class_install_info (G_OBJECT_CLASS (echo_class), &dbus_glib_echo_object_info);

dbus_g_object_type_install_info (G_OBJECT_TYPE (echo_class), &dbus_glib_echo_object_info);

根据他在那篇文章中的 cmets,除了更新包含目录以匹配我的盒子上的设置之外,没有进行其他更改。

但是,在运行服务器可执行文件时,我收到以下错误:

** (process:11747): CRITICAL **: dbus_g_object_type_install_info: assertion `G_TYPE_IS_CLASSED (object_type) || G_TYPE_IS_INTERFACE (object_type)' failed

此时的堆栈跟踪,根据 gdb,是

#0  0x0000003b5f40b440 in dbus_g_object_type_install_info () from /usr/lib64/libdbus-glib-1.so.2
#1  0x0000003b5722909c in g_type_class_ref () from /lib64/libgobject-2.0.so.0
#2  0x0000003b57229798 in g_type_create_instance () from /lib64/libgobject-2.0.so.0
#3  0x0000000000400f16 in main (argc=<value optimized out>, argv=0x7fff156497d8) at EchoObject.c:111

我不确定出了什么问题,或者调试的下一步应该是什么。我想要一些发送和接收 D-Bus 方法调用消息的基本代码,这样我就可以看到在我的应用程序中应该如何工作。

我正在使用 D-Bus 0.73。

更新:鉴于我没有成功,而且这里没有回应,我目前正在考虑放弃 D-Bus 并寻找其他 IPC 机制。

更新 2:最后,我采用了 Unix 命名的套接字方法,这正是我需要它在总共 280 行代码(加上测试代码)中做的事情。

【问题讨论】:

【参考方案1】:

在下面一行

dbus_g_object_type_install_info (G_OBJECT_TYPE (echo_class), &dbus_glib_echo_object_info);

您需要使用 G_OBJECT_CLASS_TYPE() 宏而不是 G_OBJECT_TYPE()。

这是因为 echo_class 是 EchoClass 的一个实例,它是 GObject 世界中的“类结构”。 G_OBJECT_TYPE() 用于“对象结构”,即上述示例中的 Echo 结构。

我知道这个答案对@me_and 来说太晚了,但也许其他人会觉得它很有用。

【讨论】:

【参考方案2】:

dbus-glib 非常......使用起来很讨厌,而且它在这一点上基本上没有维护。您最好使用它即将推出的替代品 GDBus,它将包含在下一个稳定的 GLib 版本中。查看文档的Lowlevel D-Bus support 和Highlevel D-Bus support 部分了解更多详细信息。

【讨论】:

我现在采用了不同的解决方案,所以我认为我不会等待 GDBus 出现。还是谢谢!

以上是关于D-Bus GLib 绑定​​——无法让代码脱离实际的主要内容,如果未能解决你的问题,请参考以下文章

IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)

如何同时监听 D-Bus 事件和 IPC 通道?

D-Bus:没有 ObjectManager 的导出对象

linux 进程间通信 dbus-glib实例详解二(上) 消息和消息总线(附代码)

linux 进程间通信 dbus-glib实例详解一(附代码)(d-feet工具使用)

linux 进程间通信 dbus-glib实例详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)