linux下dbus的理解學習

2022-09-06 19:54:09 字數 2029 閱讀 6080

最近在設計乙個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的方式非常相似...