探索DBus的神秘宇宙有何独特之处?

2026-05-17 03:491阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计641个文字,预计阅读时间需要3分钟。

探索DBus的神秘宇宙有何独特之处?

在Linux开发中,我们经常使用DBus进行进程间通信。但要理解DBus的服务端和客户端端点,很多人可能都会遇到一些含糊不清的问题。接下来,我们直接上干货。

故事背景

在linux开发中我们经常会用到dbus来进行进程间通信,但是如何理解dbus服务端和客户端呢?很多小伙伴可能都会遇到类似的问题,而且都是含含糊糊的,接下来我们直接上硬菜。

探索之路
  1. 首先要明白dbus是什么,有什么作用?
  2. 如何把自己的程序做成dbus服务?
  3. 如何调用dbus接口?
经验心得

基础的概念这里就不在介绍了,大家可以在网上自行查找,资料很多,下面我会把我遇到的问题和一些经验分享给大家。

一. dbus服务端
  1. xxx.h 头文件需要准备的东西

class Test : public QObject, protected QDBusContext { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.test") public slots: void slot1(); signals: void signal1(); }

  1. 根据头文件生成对应的xml文件

qdbuscpp2xml -A test.h -o com.test.xml

  1. 根据xml生成生成Adaptor类,这里介绍cmake的写法

qt5_add_dbus_adaptor( test_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/com.test.xml test.h Test )

  1. main函数准备的内容

#include "testadaptor.h" #define Service "com.test" #define Path "/com/test" #define Interface "com.test" int main(int argc, char *argv[]) { QApplication app(argc, argv); Test test; TestAdaptor adapter(&test); Q_UNUSED(adapter); if (!QDBusConnection::sessionBus().registerService(Service)) { return -1; } if (!QDBusConnection::sessionBus().registerObject(Path, Interface, &watermark)) { return -2; } return app.exec(); }

到此为止,dbus服务端相关的准备工作已经全部完成,如果你希望别人在调用你dbus接口的时候拉起dbus服务,那么你还要做下面的准备:

  • 准备test.service文件

[Unit] Description=xxx [Service] Type=simple ExecStart=/usr/bin/test Restart=always RestartSec=1 [Install] WantedBy=default.target

  • test.service文件安装位置/share/dbus-1/services,这里我们直接写到cmake中

install_files( "/share/dbus-1/services" FILES ${CMAKE_CURRENT_BINARY_DIR}/com.deepin.watermark.service ) 二. 客户端调用dbus接口

  1. 监听信号

QDBusConnection::sessionBus().connect("servername", "path", "interface", "signal", this, SLOT(xxx()));

  1. 调用方法和属性

QDBusInterface screensaverInterface("servername", "path", "interface"); screensaverInterface.property("isRunning").toBool();//获取属性值 QDBusReply<void> reply = screensaverInterface.call("method");//调用方法

  1. 监听属性信号变化

QDBusConnection::sessionBus().connect("servername", "path", "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(displayProperty(QString, QVariantMap, QStringList))); 参考资料

Qt高级——D-Bus快速入门1
Qt高级——D-Bus快速入门2

探索DBus的神秘宇宙有何独特之处?

走的太远不要忘记为什么出发,你的态度决定你的高度。

本文共计641个文字,预计阅读时间需要3分钟。

探索DBus的神秘宇宙有何独特之处?

在Linux开发中,我们经常使用DBus进行进程间通信。但要理解DBus的服务端和客户端端点,很多人可能都会遇到一些含糊不清的问题。接下来,我们直接上干货。

故事背景

在linux开发中我们经常会用到dbus来进行进程间通信,但是如何理解dbus服务端和客户端呢?很多小伙伴可能都会遇到类似的问题,而且都是含含糊糊的,接下来我们直接上硬菜。

探索之路
  1. 首先要明白dbus是什么,有什么作用?
  2. 如何把自己的程序做成dbus服务?
  3. 如何调用dbus接口?
经验心得

基础的概念这里就不在介绍了,大家可以在网上自行查找,资料很多,下面我会把我遇到的问题和一些经验分享给大家。

一. dbus服务端
  1. xxx.h 头文件需要准备的东西

class Test : public QObject, protected QDBusContext { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.test") public slots: void slot1(); signals: void signal1(); }

  1. 根据头文件生成对应的xml文件

qdbuscpp2xml -A test.h -o com.test.xml

  1. 根据xml生成生成Adaptor类,这里介绍cmake的写法

qt5_add_dbus_adaptor( test_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/com.test.xml test.h Test )

  1. main函数准备的内容

#include "testadaptor.h" #define Service "com.test" #define Path "/com/test" #define Interface "com.test" int main(int argc, char *argv[]) { QApplication app(argc, argv); Test test; TestAdaptor adapter(&test); Q_UNUSED(adapter); if (!QDBusConnection::sessionBus().registerService(Service)) { return -1; } if (!QDBusConnection::sessionBus().registerObject(Path, Interface, &watermark)) { return -2; } return app.exec(); }

到此为止,dbus服务端相关的准备工作已经全部完成,如果你希望别人在调用你dbus接口的时候拉起dbus服务,那么你还要做下面的准备:

  • 准备test.service文件

[Unit] Description=xxx [Service] Type=simple ExecStart=/usr/bin/test Restart=always RestartSec=1 [Install] WantedBy=default.target

  • test.service文件安装位置/share/dbus-1/services,这里我们直接写到cmake中

install_files( "/share/dbus-1/services" FILES ${CMAKE_CURRENT_BINARY_DIR}/com.deepin.watermark.service ) 二. 客户端调用dbus接口

  1. 监听信号

QDBusConnection::sessionBus().connect("servername", "path", "interface", "signal", this, SLOT(xxx()));

  1. 调用方法和属性

QDBusInterface screensaverInterface("servername", "path", "interface"); screensaverInterface.property("isRunning").toBool();//获取属性值 QDBusReply<void> reply = screensaverInterface.call("method");//调用方法

  1. 监听属性信号变化

QDBusConnection::sessionBus().connect("servername", "path", "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(displayProperty(QString, QVariantMap, QStringList))); 参考资料

Qt高级——D-Bus快速入门1
Qt高级——D-Bus快速入门2

探索DBus的神秘宇宙有何独特之处?

走的太远不要忘记为什么出发,你的态度决定你的高度。