最近在設計乙個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個值需要注意:
2. bus name:當你使用匯流排守護程序時(你看程序表裡不是有很多dbus-daemon嘛,3層結構的第二層),你只用通過乙個bus name就可以直接將訊息路由到你想要的位址。所以這麼方便,幹嘛用上面的。server端想要bus name需要向systembus或sessionbus申請。如果不申請連線到dbus,它會自動被分配乙個唯一的名字,就是1.45之類的,這數字沒什麼意義,只是為了名字唯一。名字除了路由訊息還有第二種用途,就是當乙個程式退出,斷開連線,訊息匯流排就會提醒其他連線程式該名字失去了所有者。這樣就容易管理其他程式了
3. path:這個路徑是指你在程序裡的路徑,你可以按模組來劃分,比如netwrokmanager 有 無線和有線這兩模組。
4. inte***ce:他就像是一組功能的集合名字,你可以按功能來劃分。
5. method/signals:方法和訊號,方法其實就是程序裡的函式名,你發訊息給這個函式名,這個函式就會被呼叫,並返回結果。訊號就是當server端主動呼叫這個訊號函式的時候,便會發出這個訊號(訊號名就是函式名),其他連線在同一匯流排上的程式,如果誰感興趣就會接收處理。
所以總的來說,其實可以這樣理解,address和bus name就相當於你家的城市位址,path就相當於你家住哪個縣哪個區,inte***ce就相當於你家哪個村哪個路,method就相當於你家哪個人。dbus則充當了郵局的身份。
那先嘗試下傳送個訊息看看:
d-feet在systembus下可以找到org.freedesktop.dbus這個bus name,它有個path叫 「 / 」,「 / 」下面有org.freedesktop.dbus這個inte***ce,裡面有個叫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] [inte***ce].[method] 表示位址,注意method是接在inte***ce後面的。
dbus python示例可以看 比較詳細
linux下程序的理解
1.關於程序的理解 程序即執行的所有程式和開啟的服務,關掉其程序和服務將有利於釋放記憶體,減輕電腦空間壓力。1 windows的程序如下 2 linux中的程序如下 檢視所有程序 ps命令可以列出系統中當前執行的程序,所列出的程序是在執行ps命令這個時刻正在執行的程序。此外也可以用 2.檢視指定程序...
學習 理解 Linux下的系統呼叫過程
在應用程式中,很多時候都會呼叫到系統呼叫來完成一些操作,可是系統呼叫是在核心態下才能呼叫,使用者態下的應用程式是無法直接呼叫到的,那麼作業系統是怎麼處理這一過程的呢?本文的環境是基於linux 0.11,沒有查證現代作業系統是否有所變化,不過基本思路應該差不多。先來看一張圖,有個大概的理解。首先,應...
D Bus學習(六) Method的收發小例子
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!我們繼續學習d bus,參考相關的api介面reference參考從底層,即libdbus學習如何傳送method以及如何等待應答,在上上次學習中,給出了同步的方式,這是更為高層的處理方式,建議使用。監聽method和監聽signal的方式非常相似...