如何确定使用哪个 D-Bus 绑定

Posted

技术标签:

【中文标题】如何确定使用哪个 D-Bus 绑定【英文标题】:How to figure out which D-Bus binding to use 【发布时间】:2015-03-01 07:52:14 【问题描述】:

我正在尝试跨所有 linux 检测屏幕保护程序是否正在运行或屏幕是否被锁定。

人们推荐了 dbus。所以现在我正在尝试使用 x11 或 C API 或其他可用的 dbus 自动检测,然后使用它。像qdubs、gdbus等?

谢谢

【问题讨论】:

【参考方案1】:

您已经注意到,有多种可用的 D-Bus 绑定。正如 Ignacio 所说,您可以使用它们中的任何一个,因为它们都使用相同的协议——但某些绑定比其他绑定更适合某些情况。

推荐的高级绑定:

GDBus 是一个基于 GLib/GObject 的高级绑定。如果您正在编写基于 GNOME 技术或 GLib 的服务或应用程序,则可以使用它。它是用 C 编写的,但使用 gobject-introspection 可以为其他语言提供绑定(在不同的功能级别上)。 QtDBus 是一个基于 Qt 的高级绑定。如果您正在编写基于 Qt 的服务或应用程序,则可以使用它。它是用 C++ 编写的。

推荐的低级绑定:

sd-bus 是一个低级绑定,依赖很少。如果您正在编写系统服务或系统应用程序并且不使用 GLib 或 Qt,则它是合适的。它是用 C 语言编写的。

推荐绑定:

libdbus 是官方 D-Bus 实现附带的较低级别的绑定。它已经过时了,设计 D-Bus API 的最佳实践自编写以来已得到改进。建议您使用 libdbus。正如文档中所说:“如果你直接使用这个低级 API,你注册会有些痛苦。”。使用起来很尴尬。它是用 C 语言编写的。 dbus-glib 是一个高级绑定,附属于官方 D-Bus 实现。与 libdbus 一样,它已经过时了,并且从那时起最佳实践一直在发展。建议您使用 dbus-glib,而使用 GDBus。使用起来很尴尬。它是用 C 语言编写的。

有各种bindings for other languages available,但我不确定它们的相对优点(如果有人想编辑这个答案以涵盖这些,那就太好了)。

【讨论】:

非常感谢您提供如此详细的答复。这是真正将我的点与 Igancio 的答案联系起来的细节。谢谢!【参考方案2】:

您无需检测正在使用的 D-Bus 绑定。由于它们都以相同的方式对同一事物说话,因此您只需要使用您的绑定来与消息总线对话并与任何其他 D-Bus 客户端交互。

【讨论】:

非常感谢!!怎么知道我应该做qdubs还是gdubs呢?看到这个人在这里发布了一个问题:askubuntu.com/questions/505681/… 他正在使用 qdbus,然后有人发布告诉他使用 gdbus 解决了问题 是的……不。他们都对同一件事说同样的话。我不知道为什么它对他有用,而不是另一个,但无论如何,这是一个红鲱鱼。

以上是关于如何确定使用哪个 D-Bus 绑定的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 GDBus 通过 D-Bus 发送字节数组(类型为 `ay`)

如何使用 D-Bus 获取设备名称?

如何使用 D-Bus 和 Python 3 读取通知

使用 gdbus-codegen 骨架时如何验证 D-Bus 属性

如何使用 python 通过 D-Bus 从 Skype 接收事件?