Glib学习(27) dbus编译

骑猪看日落 2023-02-09 14:18 73阅读 0赞

最近想学习gdbus,gdbus是对dbus的一种封装,能够更好的使用dbus。DBUS是一种高级的进程间通信机制。DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信息转发到目的进程。DBUS后台进程充当着一个路由器的角色。DBUS中主要概念为总线,连接到总线的进程可通过总线接收或传递消息,总线收到消息时,根据不同的消息类型进行不同的处理。
https://blog.csdn.net/yishuige/article/details/52852531
这篇文章是介绍dbus的,可以不用看例程,看看基本概念。
研究gdbus开始时当然是他的库的编译,经过一番查找,发现gdbus是包含在glib的gio中,所以我们只需要编译出glib就可以正常使用gdbus了。
开始在网上找了个例程,经过编译之后想运行一下,看看效果,运行时总是进入GBusNameLostCallback,也就是无法获取总线名字,后来看了
https://blog.csdn.net/gxh9314/article/details/79093711?utm\_source=blogxgwz9
关于dbus的部署,发现gdbus功能实现需要dbus-daemon的支持。
这篇文章就讲一下我们如何编译、安装、部署dbus。
如果你的设备能够直接apt install 可以直接跳转到部署环节。

下载dbus源码

dbus官方网站
https://www.freedesktop.org/wiki/Software/dbus/
我使用的版本,下载网址
https://gitlab.freedesktop.org/dbus/dbus/-/tree/dbus-1.12

下载之后就是选择一个地方进行解压,准备进行编译。

  1. tar xvf dbus-dbus-1.12.tar
  2. cd dbus-dbus-1.12

编译 安装

当拿到一个开源代码时,我们可以先看一下他的readme,如果有install可以看一下,一般编译的方法都在这个文件中。
dbus提供了两种编译方式,autoconfig和cmake
两种方式得到的生成产物不同。
autoconfig会生成dbus.service和dbus.socket,并尝试安装到系统中。
但是他的可执行只有dbus-daemon
cmake中间过程生成文件统一放在一个文件夹中,比较整洁
可执行会生成更多的相关命令和测试命令,但是很可能这些东西不会用到。
而且不会生成dbus.service和dbus.socket。
我的建议是使用cmake编译,然后根据bus/dbus.service.in编写自己的service文件。
下面分别讲一下两个编译过程

  1. ./autogen.sh
  2. ./configure --prefix=/xxx
  3. make
  4. make install

其中—prefix=是可选的安装路径

编译完成后会输出一些关于安装的信息

  1. ldflags: -Wl,--no-as-needed
  2. 64-bit int: long
  3. 32-bit int: int
  4. 16-bit int: short
  5. Doxygen: /usr/bin/doxygen
  6. xmlto: /usr/bin/xmlto
  7. ducktype: no
  8. yelp-build: no
  9. Rebuilding generated files: yes
  10. gcc coverage profiling: no
  11. Building embedded tests: no
  12. Building modular tests: auto
  13. - with GLib: yes
  14. Installing tests: no
  15. Building verbose mode: no
  16. Building assertions: no
  17. Building checks: yes
  18. Building bus stats API: yes
  19. Building SELinux support: no
  20. Building AppArmor support: no
  21. Building inotify support: yes
  22. Building kqueue support: no
  23. Building systemd support: yes
  24. Building X11 code: yes
  25. Building Doxygen docs: yes
  26. Building Ducktype docs: no
  27. Building XML docs: yes
  28. Building launchd support: no
  29. System bus socket: /home/xxx/glibtest/gdbus/dbus/var/run/dbus/system_bus_socket
  30. System bus address: unix:path=/home/xxx/glibtest/gdbus/dbus/var/run/dbus/system_bus_socket
  31. System bus PID file: /home/xxx/glibtest/gdbus/dbus/var/run/dbus/pid
  32. Session bus listens on: unix:tmpdir=/tmp
  33. Session clients connect to: autolaunch:
  34. pam_console auth dir: (none)
  35. Console owner file: no
  36. Console owner file path:
  37. System bus user: messagebus
  38. Session bus services dir: /home/xxx/glibtest/gdbus/dbus/share/dbus-1/services
  39. 'make check' socket dir: /tmp
  40. Libraries have been installed in:
  41. /home/xxx/glibtest/gdbus/dbus/lib
  42. /usr/bin/install: 无法删除'/lib/systemd/system/dbus.service': 权限不够
  43. /usr/bin/install: 无法删除'/lib/systemd/system/dbus.socket': 权限不够

cmake编译

  1. mkdir dbus-build-dir
  2. cd dbus-build-dir
  3. cmake -DCMAKE_INSTALL_PREFIX=/xxx ../cmake
  4. make
  5. make install

其中-DCMAKE_INSTALL_PREFIX=是可选的安装路径

到此就完成了dbus的编译和安装,在安装的路径下可以找到dbus-daemon,如果需要作为服务启动需要编写相应的.service文件。

部署

https://blog.csdn.net/gxh9314/article/details/79093711?utm\_source=blogxgwz9
这篇文章讲的很详细,主要就是
启动dbus-daemon

  1. dbus-daemon --session --address=unix:path=/var/run/dbus/session_bus_socket &

设置环境变量

  1. export DBUS_SESSION_BUS_ADDRESS=unix:path=/var/run/dbus/session_bus_socket

路径必须存在,并且环境变量和启动参数必须一致,如果你是service启动可以在service文件中设置环境变量

  1. Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/var/run/dbus/session_bus_socket"

部署完成,下一篇贴上gdbus例程。

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dbus(dbus-daemon)

    如何高效的利用dbus做client-server架构 //如果要传回数据到client侧,假设处理过的数据为:your\_strcut\_tdealed\_with\_

    相关 dbus和qtdbus

    什么是D-Bus? D-Bus是一种消息总线系统,用于两个应用之间的通信。 对于进程间通信,D-Bus也可以管理应用的生命周期, Qt D-Bus D-Bus

    相关 DBus学习资料

    网上搜集的一些关于dbus学习的资料。尤其是“一个完整的DBus学习教程”这份资料非常有借鉴意义。另外DBus官方网站中dbus-tutorial这篇文章也非常值得学习。还有“