linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)
linux 進程間通信 dbus-glib【實例】詳解一(附代碼)(d-feet工具使用)
linux 進程間通信 dbus-glib【實例】詳解二(上) 消息和消息總線(附代碼)
linux 進程間通信 dbus-glib【實例】詳解二(下) 消息和消息總線(ListActivatableNames和服務器的自動啟動)(附代碼)
linux 進程間通信 dbus-glib【實例】詳解三 數(shù)據(jù)類型和dteeth(類型簽名type域)(層級結(jié)構(gòu):服務Service --> Node(對象、object) 等 )(附代碼)
linux 進程間通信 dbus-glib【實例】詳解四(上) C庫 dbus-glib 使用(附代碼)(編寫接口描述文件.xml,dbus-binding-tool工具生成綁定文件)
linux 進程間通信 dbus-glib【實例】詳解四(下) C庫 dbus-glib 使用(附代碼)
文章目錄
- dbus實例講解(二下):消息和消息總線
- 2.3.2、ListActivatableNames和服務器的自動啟動
- 2.3.3、其它方法
- NameHasOwner判斷有沒有連接擁有指定的公共名:
- GetNameOwner返回公共名對應的唯一名:
- GetConnectionUnixUser返回指定連接對應的服務器進程的Unix用戶id:
- GetId返回消息總線的ID:
- 3 結(jié)束語
dbus實例講解(二下):消息和消息總線
2.3.2、ListActivatableNames和服務器的自動啟動
運行:(普通用戶下都能運行,root用戶下只能運行system,session運行不了)
$ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames
和
$ dbus-send --session --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames
返回的數(shù)據(jù)是一樣的。在我的電腦上返回的數(shù)據(jù)是:
我們也可以用python腳本調(diào)用ListActivatableNames。例如:寫一個叫dls.py的腳本:(我ubuntu沒裝python就不演示了)
$ cat dls.py #!/usr/bin/env python import dbus bus=dbus.SystemBus() bus_obj=bus.get_object('org.freedesktop.DBus', '/') iface=dbus.Interface(bus_obj, 'org.freedesktop.DBus') names=iface.ListActivatableNames() for n in names:print n運行:
$ ./dls.py |sort輸出為:
com.redhat.dhcp net.ekiga.helper net.ekiga.instance org.freedesktop.DBus org.freedesktop.Notifications org.freedesktop.PowerManagement org.freedesktop.SystemToolsBackends org.freedesktop.SystemToolsBackends.GroupsConfig org.freedesktop.SystemToolsBackends.HostsConfig org.freedesktop.SystemToolsBackends.IfacesConfig org.freedesktop.SystemToolsBackends.NFSConfig org.freedesktop.SystemToolsBackends.NTPConfig org.freedesktop.SystemToolsBackends.Platform org.freedesktop.SystemToolsBackends.ServicesConfig org.freedesktop.SystemToolsBackends.SMBConfig org.freedesktop.SystemToolsBackends.TimeConfig org.freedesktop.SystemToolsBackends.UsersConfig org.freedesktop.Tracker org.gnome.GnomeVFS.Daemon org.gnome.Rhythmbox org.gnome.SettingsDaemon org.gnome.Tomboy使用python腳本調(diào)用dbus接口是不是很簡單。如果你看過dbus-glib的代碼(后面會講解),你對python的簡潔會有更深刻的感觸(額,,,這是暗示dbus-glib代碼很復雜??)。如果你執(zhí)行:
$ cat /usr/share/dbus-1/services/*|grep Name|awk -F= '{print $2}'|sort(ubuntu里service里有東西,arm攝像頭service目錄下啥也沒有)
你會得到:
這條命令的輸出與ListActivatableNames的輸出是不是基本相同?你能看懂上面這條命令嗎?
(cat /usr/share/dbus-1/services/*|grep Name|awk -F= ‘{print $2}’|sort)
它將"/usr/share/dbus-1/services/"下所有文件交給grep篩選出包含“Name”的行。將包含“Name”的行交給awk處理,awk用"="作為列分隔符,取出第二列然后交給sort排序后輸出。
"/usr/share/dbus-1/services/"目錄就是dbus放service文件的地方。需要自動啟動的服務器會在這個目錄放一個service文件,例如:
$ cat /usr/share/dbus-1/services/dhcdbd.service
[D-BUS Service] Name=com.redhat.dhcp Exec=/usr/sbin/dhcdbdName是服務器的公共名,Exec是服務器的執(zhí)行路徑。在客戶請求一個服務,但該服務還沒有啟動時。dbus會根據(jù)service文件自動啟動服務。我們再寫一個調(diào)用“org.fmddlmyy.Test”的Add接口的python腳本:
$ cat add.py #!/usr/bin/env python import dbus bus = dbus.SessionBus() obj = bus.get_object( 'org.fmddlmyy.Test', '/TestObj' ) iface = dbus.Interface(obj, 'org.fmddlmyy.Test.Basic') sum = iface.Add(100, 999) print sum在啟動“org.fmddlmyy.Test”服務器前調(diào)用這個腳本
$ ./add.py
會得到錯誤輸出:
我們編輯一個service文件:
$ cat org.fmddlmyy.Test.service [D-BUS Service] Name=org.fmddlmyy.Test Exec=/home/lvjie/work/dbus/hello-dbus3-0.1/src/example-service把這個文件放到"/usr/share/dbus-1/services/"目錄后,再執(zhí)行add.py:
$ sudo cp org.fmddlmyy.Test.service /usr/share/dbus-1/services/
$ cd …/…/py
$ ./add.py
1099
這次dbus自動啟動了服務器,我們的客戶腳本得到了正確的輸出,你有沒有感到dbus的神奇?dbus在自動啟動服務器后,不會自動關(guān)閉。如果沒人管它,這個服務器會一直開著。
2.3.3、其它方法
再演示幾個“org.freedesktop.DBus”接口的方法。
NameHasOwner判斷有沒有連接擁有指定的公共名:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.NameHasOwner string:"org.fmddlmyy.Test"
輸出為:
GetNameOwner返回公共名對應的唯一名:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetNameOwner string:"org.fmddlmyy.Test"
輸出為:
GetConnectionUnixUser返回指定連接對應的服務器進程的Unix用戶id:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetConnectionUnixUser string:":1.30"
輸出為:
這就是我的用戶id:
$ id -u lvjie
1000
GetId返回消息總線的ID:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
輸出為:
3 結(jié)束語
這一集有一些python代碼。即使你沒有學過python,我也建議你看一看、試一試。其實我也沒有學過python。 小時候,好像聽過什么德國人一邊看說明書一邊開飛機的笑話。這或許是吹牛,但對于程序員來說一邊查手冊一邊用新語言寫一些簡單程序應該不算困難。 下一講我們要寫一個略大點的python程序。雖然我習慣于C/C++的事必躬親,但不可否認python確實是很有魅力的語言, 難怪在嵌入式環(huán)境也有那么多人用python作原型開發(fā)。
參考文章:dbus實例講解(二下):消息和消息總線
總結(jié)
以上是生活随笔為你收集整理的linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 进程间通信 dbus-gli
- 下一篇: linux 进程间通信 dbus-gli