最近在設計一個linux桌面程序。而進程間的交互准備使用dbus來解決。
介紹:
有那么個組織叫freedesktop,它是專門為linux桌面制定標准的。什么KDE,GNOME都是按他的標准來的。而dbus是其中的桌面消息機制的一個標准。
dbus是一個IPC的管理系統,其實就底層來說就是本地socket通信。但是他是將所有的消息都通過總線的方式來管理分發,易於管理和安全。
dbus一般就是3層結構:
1. libdbus庫,允許兩個應用相互連接交換消息
2. 一個建立在libdbus上的消息總線守護程序,這個守護程序可以路由消息
3. 封裝庫,比如libdbus-glib或libdbus-qt。一般都是使用封裝庫來簡化使用dbus的細節。
一般gtk(c語言)開發的話,可以使用gobject-dbus庫,qt(c++)的話可以使用dbus-qt庫,而python使用python-dbus模塊。
還有nodejs的話,我推薦使用node-native模塊(配合nodewebkit還是比較好用的)。
還有做dbus相關開發的話,使用一個叫d-feet工具,就可以查看當前所有在使用中的dbus名稱及其他屬性。
dbus分為兩種總線,一種叫SystemBus,一種叫SessionBus。SystemBus就只有一條,SessionBus是一個用戶會話時會產生一條。至於這兩種的區別,SystemBus一般是用於權限較高的系統級(root)進程與其他進程(可以是普通進程)的通信,而SessionBus是用於普通的用戶進程之間的交流。
dbus是單對單的通信,其實和C/S架構差不多,一個server端接收消息和發布信號,多個client端發送消息和接收信號。
dbus通信的話有5個值需要注意:
1. Address:因為dbus也是通過本地socket來通信,所有會有socket文件。你可以直接連接這個sokcet文件的地址來通信,但這個我幾乎不用。
2. Bus Name:當你使用總線守護進程時(你看進程表里不是有很多dbus-daemon嘛,3層結構的第二層),你只用通過一個Bus Name就可以直接將消息路由到你想要的地址。所以這么方便,干嘛用上面的。server端想要Bus Name需要向SystemBus或SessionBus申請。如果不申請連接到dbus,它會自動被分配一個唯一的名字,就是1.45之類的,這數字沒什么意義,只是為了名字唯一。名字除了路由消息還有第二種用途,就是當一個程序退出,斷開連接,消息總線就會提醒其他連接程序該名字失去了所有者。這樣就容易管理其他程序了
3. Path:這個路徑是指你在進程里的路徑,你可以按模塊來划分,比如NetwrokManager 有 無線和有線這兩模塊。
4. Interface:他就像是一組功能的集合名字,你可以按功能來划分。
5. Method/Signals:方法和信號,方法其實就是進程里的函數名,你發消息給這個函數名,這個函數就會被調用,並返回結果。信號就是當server端主動調用這個信號函數的時候,便會發出這個信號(信號名就是函數名),其他連接在同一總線上的程序,如果誰感興趣就會接收處理。
所以總的來說,其實可以這樣理解,Address和Bus Name就相當於你家的城市地址,Path就相當於你家住哪個縣哪個區,Interface就相當於你家哪個村哪個路,Method就相當於你家哪個人。dbus則充當了郵局的身份。
那先嘗試下發送個消息看看:
d-feet在SystemBus下可以找到org.freedesktop.DBus這個Bus Name,它有個Path叫 “ / ”,“ / ”下面有org.freedesktop.DBus這個Interface,里面有個叫GetId的Methods,可以跟它通信一下。這里使用dbus-send命令來發送。dbus-send是dbus提供的一個命令,可直接向目標發送消息。
~ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
返回打印出了一個值,這個值就是GetId函數的執行結果。
dbus-send使用方法: --system表示是System Bus,--print-reply表示打印回復信息, --desk=[Bus Name] [Path] [Interface].[Method] 表示地址,注意Method是接在Interface后面的。
dbus python示例可以看http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html 比較詳細
dbus官方wiki:http://www.freedesktop.org/wiki/Software/dbus/
————————————————
版權聲明:本文為CSDN博主「Meowstic」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Wu_Roc/article/details/44516339