linux dbus-daemon进程 消息转发 简介

一:说明

D-Bus daemon是D-Bus的非常重要的一个服务,类似于IP网络中的路由器。

跟这个后台服务有关的应用程序包括:

dbus-daemon: D-Bus的后台进程,作为D-Bus的消息中转枢纽,可分成system和session两种。

dbus-launch: 启动一个dbus-daemon,后面有不同的参数。一般而言,dbus-daemon启动后需要将其地址告诉给所有需要使用该bus的applications。

当系统启动时,需要使用dbus-launch来启动dbus-daemon,一般而言,

一般采用下面的命令启动dbus daemon以及dbus application

(1) eval `dbus-launch --auto-syntax`

(2) ./yourapp

第一行代码,采用eval来执行两次,第一次执行dbus-lauch --auto-syntax,除了启动dbus daemon之外,还输出了下面的内容:

DBUS_SESSION_BUS_ADDRESS='unix:path=/tmp/dbus-6Z62FMmwf3,guid=5dbd92e4865a3f56880d2120000000d6';
export DBUS_SESSION_BUS_ADDRESS;
DBUS_SESSION_BUS_PID=998;

第二次执行时就将环境变量DBUS_SESSION_BUS_ADDRESS暴露出去了。所有的dbus application在注册DBUS服务时,必须知道这个DBUS_SESSION_BUS_ADDRESS的数据。

在第二行执行自己的dbus application的时候,根据DBUS_SESSION_BUS_ADDRESS环境变量,能够找到session bus进行注册和通讯。

二:理解

dbus-daemon是一个后台进程,负责消息的转发。它就像个路由器。最常见的基于dbus的程序也是符合C/S结构的。 

      比如我们自己写了两个程序,A和B,其中A是客户,B是服务。假设A要调用B的一个函数C,那么实际的消息流动方向是:A告诉dbus-daemon我要调用B的C函数,然后dbus-daemon则去调用B的C函数,如果C有返回值的话,B会把返回值告诉dbus-daemon,然后dbus-daemon再把返回值告诉A。由此可以看出,dbus-daemon是很关键的一个后台进程。

      以ubuntu为例,通常情况下,会有两个dbus-daemon进程,一个是属于system的,一个是属于session的,这两个进程,都是在用户登录的时候由dbus-launch启动的。

      大多数普通程序,都是使用session的dbus-daemon,默认情况下,A就是将消息发给了这个属于session的dbus-daemon。

      但是在调试过程中,有时想看到一些更详细的信息,因此可以自己再启动一个dbus-daemon,现在就有一个问题,A的消息是流向了哪一个dbus-daemon?

      其实dbus-daemon是有地址的,而且有一个环境变量来表示它--DBUS_SESSION_BUS_ADDRESS,可以用命令env查看到。我们的程序,也就就是依靠这个环境变量来确认使用哪一个dbus-daemon的。

      当我们登录进桌面环境的时候,系统启动脚本会调用到dbus-launch来启动一个dbus-daemon,同时会把这个dbus-daemon的地址赋予环境变量DBUS_SESSION_BUS_ADDRESS。

      一般情况下,我们是不需要考虑DBUS_SESSION_BUS_ADDRESS的,但是,有些时候,单独启动一个dbus-daemon,则有助于程序的调试。

      比如,还是假设我们写了两个程序,A和B,其中A是客户,B是服务。同时还使用dbus的自启动功能(简要说明一下,什么是dbus的自启动----A要调用B的函数,如果B进程还没有启动,则dbus-daemon会自动的先把B进程启动起来,这就是自启动)。

      由于利用dbus-daemon自启动机制运行的服务进程,都是后台进程,标准输出设备已经被重定向了,如果B进程有一些调试用的打印信息,则很难直接查看。
      这个时候,就可以单独启动一个dbus-daemon,让A和B都使用我们自己启动的这个dbus-daemon,此时,这个dbus-daemon还能把B的打印信息显示出来。

      先在终端下启动一个dbus-daemon,命令如下形式如下:
      DBUS_VERBOSE=1 dbus-daemon --session --print-address 

      这样的话,该dbus-daemon会前台执行,并且打印出它的地址,地址形式类似于unix:abstract=/tmp/dbus-YcjSNNPJHg,guid=18b385acdbd58611ffd3196b4beb69f0

      然后,在执行我们的A程序的时候,设置环境变量DBUS_SESSION_BUS_ADDRESS为刚才得到的地址值,例如这样执行A程序:
      DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-YcjSNNPJHg,guid=18b385acdbd58611ffd3196b4beb69f0  ./A

      这样的话,我们的程序A和B,就是使用我们自己启动的这个dbus-daemon来转发消息了。同时,刚才启动dbus-daemon的那个终端,还会把B的打印信息显示出来。

      理解上面说的这个后,还可以做的更多。
      dbus-launch是一个用来启动dbus-daemon的脚本,它也会打印出它启动的那个dbus-daemon的地址。

      所有使用到dbus技术的程序,都会用到DBUS_SESSION_BUS_ADDRESS环境变量,所以,我们也可以用这个环境变量来控制dbus-monitor的行为。

 

 

如果`dbus-daemon.service`文件不存在,那么很可能是因为你在尝试启动的是默认的DBus守护进程,但它可能尚未被系统设置为默认的服务或者是还未被正确地安装或配置。以下是可能出现这种情况的一些步骤: 1. **确认版本和安装状态**:首先检查你的系统是否有DBus守护进程的官方安装包,比如在Debian、Ubuntu或基于它们的系统上,可以运行 `apt-cache policy dbus` 来查看版本信息和安装情况。 2. **安装基础包**:如果没有安装,你应该从官方仓库安装它,例如在Ubuntu上: ```sh sudo apt-get install dbus ``` 3. **检查配置**:`dbus-daemon`通常由系统自动生成服务文件,检查 `/lib/systemd/system` 目录下的配置文件。如果你找不到这个文件,说明可能没有正确地配置DBus服务。有时,服务文件可能会被移至某个特定的位置,比如在某些Linux发行版的定制环境中。 4. **生成服务文件**:如果配置文件缺失,可能需要手工创建,但这通常是系统管理员的任务。对于普通用户来说,可能需要联系系统的维护人员来处理这个问题。 5. **重启服务**:如果安装并配置好后,尝试重启dbus-daemon服务看看是否能解决问题: ```sh sudo systemctl daemon-reload sudo systemctl restart dbus-daemon ``` 6. **验证服务状态**:最后,确认`dbus-daemon.service`是否已成功启动和运行: ```sh sudo systemctl status dbus-daemon ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值