Getting start with dbus in systemd (02) - How to create a private dbus-daemon


Getting start with dbus in systemd (02)

創建一個私有的dbus-daemon (session)

環境

這里我們會有兩個app: app1(client),app2(server), 然后,再啟動一個“dbus-daemon (session)”

我們期望,app1 和 app2 之間的通信,可以使用 剛才啟動的 “dbus-daemon”

代碼在:

git clone https://github.com/muahao/hello-dbus3-0.1.git

環境:

  • centos 7

依賴:

  • dbus-x11-1.6.12-13.1.rhel7.x86_64 (提供dbus-launch)
  • dbus-glib-0.100-7.1.rhel7.x86_64(代碼實現依賴)

啟動一個dbus-daemon (session)

方式1: 使用dbus-launch 創建一個dbus-daemon:

#yum install -y dbus-x11-1:1.6.12-13.1.alios7.x86_64

#dbus-launch
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-7Q7Spuq5IH,guid=079edc76e4c5c6433d3507855c5260ce
DBUS_SESSION_BUS_PID=121376

方式2: 手動啟動

#DBUS_VERBOSE=1 dbus-daemon --session --print-address
unix:abstract=/tmp/dbus-jXwkggHTo2,guid=dc666ee7ba7ddf788efd8c485c526564

兩個方式的目的,不僅僅是啟動dbus-daemon, 更重要的是,獲得address.

注意,這里會反饋一個地址, unix:abstract=/tmp/dbus-7Q7Spuq5IH,guid=079edc76e4c5c6433d3507855c5260ce , 所以,你需要保證 你的環境變量 DBUS_SESSION_BUS_ADDRESS的值就是這個地址。

其實dbus-daemon是有地址的,而且有一個環境變量來表示它--DBUS_SESSION_BUS_ADDRESS,可以用命令env查看到。我們的程序,也就就是依靠這個環境變量來確認使用哪一個dbus-daemon的。

當我們登錄進桌面環境的時候,系統啟動腳本會調用到dbus-launch來啟動一個dbus-daemon,同時會把這個dbus-daemon的地址賦予環境變量DBUS_SESSION_BUS_ADDRESS

#ps axu | grep dbus-daemon  #新增一個dbus-daemon
dbus      91405  0.0  0.0  24312  2728 ?        Ss   Jan30   0:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root     121376  0.0  0.0  24312   228 ?        Ss   10:43   0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session   

設置環境變量DBUS_SESSION_BUS_ADDRESS

設置環境變量DBUS_SESSION_BUS_ADDRESS到為剛才啟動的dbus-daemon 的地址:

#DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-7Q7Spuq5IH,guid=079edc76e4c5c6433d3507855c5260ce

啟動server:

這里會有一個報錯:

#./example-service
Couldn't connect to session bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Fix: https://www.cnblogs.com/chutianyao/p/3770627.html

#eval `dbus-launch --sh-syntax`

正常運行:

server:

#./example-service
service running

client:

#./example-client
sum is 1099
<!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.Introspectable">
    <method name="Introspect">
      <arg name="data" direction="out" type="s"/>
    </method>
  </interface>
  <interface name="org.freedesktop.DBus.Properties">
    <method name="Get">
      <arg name="interface" direction="in" type="s"/>
      <arg name="propname" direction="in" type="s"/>
      <arg name="value" direction="out" type="v"/>
    </method>
    <method name="Set">
      <arg name="interface" direction="in" type="s"/>
      <arg name="propname" direction="in" type="s"/>
      <arg name="value" direction="in" type="v"/>
    </method>
    <method name="GetAll">
      <arg name="interface" direction="in" type="s"/>
      <arg name="props" direction="out" type="a{sv}"/>
    </method>
  </interface>
  <interface name="org.fmddlmyy.Test.Basic">
    <method name="Add">
      <arg name="arg0" type="i" direction="in"/>
      <arg name="arg1" type="i" direction="in"/>
      <arg name="ret" type="i" direction="out"/>
    </method>
  </interface>
</node>

Ref:

https://blog.csdn.net/jack0106/article/details/5588057

http://www.fmddlmyy.cn/text49.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM