DBus daemon 启动(三)

独自空忆成欢 提交于 2019-11-26 05:15:32

前面简单了解一下,DBus的架构和简单的应用编程.那么接下来,就来看看,DBus是怎么启动的,这一往篇不涉及内部实现问题,只是介绍dbus-daemon如何启动及涉及哪里配置


一.编译Dbus库完成之后,包含:
可执行文件: dbus-daemon, dbus-launch, dbus-send, dbus-monitor, dbus-cleanup-sockets, dbus-run-session, dbus-test-tool,dbus-update-activation-environment, dbus-uuidgen.这里面最常用的就是dbus-daemon,不然dbus不能使用.其他先不做了解,目前只会用到dbus-daemon.
库文件:libdbus-1.a, libdbus-1.la, libdbus-1.so.3.13.0生成这三个库,包含的就是咱们应用编程接口.比如dbus_bus_get()


二.dbus-daemon
->dbus-deamon是一个D-Bus消息总线daemon,跑在后台,它支持两个应用进程间一对一的通信,dbus-deamon也是用上面的库实现的
->系统启动之后,有两个dbus daemon的实例, 一个称为system, 一个称为session(如果是多个用户,那么会每个用户启动一个),这个实例配置不同,权限也不同
->system 实例使用的配置文件=/etc/dbus-1/system.conf
->session实例使用的配置文件=/etc/dbus-1/session.conf
->一般来说system实例,被init script启动,所以具有root权根.大部分功能用于广播系统事件,比如插拨设备.
->session daemon用于不同桌面的进程通信或不同进程间的通信.
->SIGHUP 信号导致dbus-daemon重新去加载配置,如果你改变配置之后,就需要发信号给dbus-daemon,让其去重新加载配置.


三. dbus-daemon 命令参数
june@june:~$ dbus-daemon -h
dbus-daemon [--version] [--session] [--system] [--config-file=FILE] [--print-address[=DESCRIPTOR]] [--print-pid[=DESCRIPTOR]] [--fork] [--nofork] [--introspect] [--address=ADDRESS] [--systemd-activation] [--nopidfile]


[这些设置选项优先级大于配置文件所配置的]
--session                          针对每个登录用户,普通用户(普通权限的dbus daemon)
--system                          针对系统用户,超级权限(有特权的dbus daemon)
--config-file=FILE            指定dbus daemon相关配置文件位置
--fork                               让dbus daemon变为一个daemon
--nofork                        --fork的反操作
--print-address[=DESCRIPTOR]          打印出dbus daemon监听地址.
--print-pid[=DESCRIPTOR]                 打印出dbus daemon pid
--introspect                      打印出dbus daemon内部实现的方法
--address                          设置监听地址
--nopidfile                        不写pid 到文件(配置文件会配置一个文件来记录dbus daemon pid)
--systemd-activation        可能跟systemd启动服务有关,没做研究.
--syslog                             强制dbus daemon 用syslog(即会记录log,也会输出到标准输出)
--syslog-only                     仅做 syslog
--nosyslog                         仅做标准输出


------>这些是dbus daemon的一些配置
举一些例子:

1.dbus-daemon --session --print-address  --nofork --print-pid

(结果就是开启dbus-daemon session类型, 打印出监听地址,打印出pid, 且不做fork(意味着不是一个daemon))

	root@june:~# dbus-daemon --session --print-address --nofork --print-pid
	unix:abstract=/tmp/dbus-ylwBCGyhmF,guid=bd7496f59ac6455852a455b45b398e03
	6943

2.dbus-daemon --session --print-address --fork --print-pid 

 

(这个与1不同的是,做fork,变为一个daemon)

 

	root@june:~# dbus-daemon --session --print-address --fork --print-pid
	unix:abstract=/tmp/dbus-01B2SkM7sU,guid=8457d8efbb98cfd3fc6488c15b398e81
	6946
	root@june:

3.dbus-daemon --session --print-address --fork --print-pid --introspect

 

(打印出dbus daemon内部所有的方法)

 

root@june:~# dbus-daemon --session --print-address --fork --print-pid --introspect
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="org.freedesktop.DBus">
    <method name="Hello">
      <arg direction="out" type="s"/>
    </method>
    <method name="RequestName">
      <arg direction="in" type="s"/>
      <arg direction="in" type="u"/>
      <arg direction="out" type="u"/>
    </method>
    <method name="ReleaseName">
      <arg direction="in" type="s"/>
      <arg direction="out" type="u"/>
    </method>
    <method name="StartServiceByName">
      <arg direction="in" type="s"/>
      <arg direction="in" type="u"/>
      <arg direction="out" type="u"/>
    </method>
    <method name="UpdateActivationEnvironment">
      <arg direction="in" type="a{ss}"/>
    </method>
    <method name="NameHasOwner">
      <arg direction="in" type="s"/>
      <arg direction="out" type="b"/>
    </method>
    <method name="ListNames">
      <arg direction="out" type="as"/>
    </method>
    <method name="ListActivatableNames">
      <arg direction="out" type="as"/>
    </method>
    <method name="AddMatch">
      <arg direction="in" type="s"/>
    </method>
    <method name="RemoveMatch">
      <arg direction="in" type="s"/>
    </method>
    <method name="GetNameOwner">
      <arg direction="in" type="s"/>
      <arg direction="out" type="s"/>
    </method>
    <method name="ListQueuedOwners">
      <arg direction="in" type="s"/>
      <arg direction="out" type="as"/>
    </method>
    <method name="GetConnectionUnixUser">
      <arg direction="in" type="s"/>
      <arg direction="out" type="u"/>
    </method>
    <method name="GetConnectionUnixProcessID">
      <arg direction="in" type="s"/>
      <arg direction="out" type="u"/>
    </method>
    <method name="GetAdtAuditSessionData">
      <arg direction="in" type="s"/>
      <arg direction="out" type="ay"/>
    </method>
    <method name="GetConnectionSELinuxSecurityContext">
      <arg direction="in" type="s"/>
      <arg direction="out" type="ay"/>
    </method>
    <method name="GetConnectionAppArmorSecurityContext">
      <arg direction="in" type="s"/>
      <arg direction="out" type="s"/>
    </method>
    <method name="ReloadConfig">
    </method>
    <method name="GetId">
      <arg direction="out" type="s"/>
    </method>
    <signal name="NameOwnerChanged">
      <arg type="s"/>
      <arg type="s"/>
      <arg type="s"/>
    </signal>
    <signal name="NameLost">
      <arg type="s"/>
    </signal>
    <signal name="NameAcquired">
      <arg type="s"/>
    </signal>
  </interface>
  <interface name="org.freedesktop.DBus.Introspectable">
    <method name="Introspect">
      <arg direction="out" type="s"/>
    </method>
  </interface>
</node>

在dbus相关编程中就有dbus_bus_request_name()接口调用,那么这个就是调用的这个列表的接口.

4. dbus-daemon --session --print-address --fork --print-pid --address=unix:abstract=/tmp/dbus-123456

(指定一个监听地址)

root@june:~# dbus-daemon --session --print-address --fork --print-pid --address=unix:abstract=/tmp/dbus-123456
unix:abstract=/tmp/dbus-123456,guid=aa09ca517dbda223d9c7657a5b398fa8
6954
root@june:~# 

----->这里说明的是,如何启动dbus-daemon,  还有一点就是,为什么上面没有设置关于--config-file问题,--config-file默认是/etc/dbus-1/[system|session].conf,下面了解配置里面有都有什么.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!