DBus - 如何列出系统总线中的所有服务(总线名称)?

Posted

技术标签:

【中文标题】DBus - 如何列出系统总线中的所有服务(总线名称)?【英文标题】:DBus - How can I list all services (bus name) in the system bus? 【发布时间】:2012-04-05 05:48:44 【问题描述】:

我想创建一个连接到 dbus --system bus 的程序并列出所有连接的服务 (bus_names)。就像“qdbus”一样。

有人可以帮助我吗?

我的 dbus 版本是 dbus-1.2.24,我正在用 C 编程(没有绑定)。

【问题讨论】:

【参考方案1】:

您可能想看看Qt DBus List Names example。

QDBusConnection bus = QDBusConnection::sessionBus();
QDBusInterface dbus_iface("org.freedesktop.DBus", "/org/freedesktop/DBus",
                          "org.freedesktop.DBus", bus);
qDebug() << dbus_iface.call("ListNames").arguments().at(0);

下面是一个使用命令行的例子:

# qdbus --literal --system org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames
"org.freedesktop.DBus", ":1.23", ":1.31", "org.freedesktop.Avahi", ":1.24", ":1.26"
# dbus-send --system --dest=org.freedesktop.DBus --print-reply=literal /org/freedesktop/DBus org.freedesktop.DBus.ListNames
   array [
      org.freedesktop.DBus      :1.23      org.freedesktop.Avahi      :1.24      :1.33      :1.26   ]

您可能还想直接转到 qt 源代码中的源代码 tools/qdbus/qdbus/qdbus.cpp。您会注意到,如果args.empty() 它调用printServiceNames(),它只返回在系统总线接口上调用的registeredServiceNames() 的结果。然后,该代码执行以下操作:

QDBusReply<QStringList> QDBusConnectionInterface::registeredServiceNames() const

    return internalConstCall(QDBus::AutoDetect, QLatin1String("ListNames"));

现在我们绕了一圈。

【讨论】:

此答案中的链接已损坏/移至doc.qt.digia.com/4.7/dbus-listnames-listnames-cpp.html 这里是链接:unix.stackexchange.com/questions/46301/… 使用 send-dbus 显示: 其实dbus-listnames最好的Qt站点是:doc.qt.io/qt-5/qtdbus-listnames-example.html

以上是关于DBus - 如何列出系统总线中的所有服务(总线名称)?的主要内容,如果未能解决你的问题,请参考以下文章

dbus总是需要总线吗

dbus 如何重新连接到新的会话总线守护进程

拆解大数据总线平台DBus的系统架构

Linux DBUS总线

如何让 Chrome 使用会话总线而不是系统总线

linux 进程间通信 dbus-glib实例详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)