簡介
D-Bus 允許程式在其上註冊以提供服務給其他的程式。同時他也提供客戶端程式查詢有哪些服務是可得的可能性。程式也可註冊以等待kernel的events比如說硬體的熱插拔。
D-Bus 以daemon的方式實現。使用者可以執行好幾個D-Bus的實體,每個實體被稱為一個channel。通常系統中會有一個特權的channel稱之為system channel,以及每個使用者擁有一個私有的實體。使用者需要私有的實體因為system channel將有存取的限制。
D-Bus受到了DCOP系統的影響而且在KDE 4中取代DCOP;他已經被集成在Qt 4, GNOME,Windows以及 Maemo 系統中。GNOME也逐漸的用它來取代了大部分的早期Bonobo機制。
System channel主要的功用在於傳遞HAL的訊息給對這些訊息感興趣的processes。而私有實體的功能在於提供程式間無限制的溝通。
運作方式
所有使用D-BUS的應用程式都包含一些對象,它們一般映射為GObject、QObject、C++對象、或者Python對象(也許不需要)。一個對象是一個實例而不是類型。當經由一個D-BUS連線受到一條訊息時,該訊息是被發往一個對象而不是整個應用程式。
為了允許訊息能指定接受對象,還要提供引用對象的方法。在你偏愛的程式語言中,它也許叫做指針或者引用。但是上述所謂引用一般實現為與應用程式相關的記憶體地址,因此無法在應用程式之間傳遞。
為了解決這一問題,D-BUS為每個對象引入名字。這些名字看起來像是檔案系統路徑,例如一個對象可能叫做“/org/kde/kspread/sheets/3/cells/4/5”。易讀的路徑名是受鼓勵的做法,但也允許使用諸如“/com/mycompany/c5yo817y0c1y1c5b”等,只要它可以為你的應用程式所用。
Namespacing的對象路徑以開發者所有的域名開始(如/org/kde)以避免系統不同代碼模組互相干擾。
架構
D-BUS是一個設計目標為應用程式間通信的訊息匯流排系統。它是個3層架構的進程間通信(IPC)系統,包括:
函式館libdbus,用於兩個應用程式呼叫聯繫和互動訊息。 一個基於libdbus構造的訊息,匯流排守護進程可同時與多個應用程式相連,並能把來自一個應用程式的訊息路由到0或者多個其他程式。 一系列基於特定應用程式框架的Wrapper庫。 D-BUS為了兩個特定情況而設計:
同一個桌面會話中兩個桌面應用程式的通信,可使得桌面會話作為整體集成在一起以解決進程生命周期的相關問題。 桌面會話和作業系統的通信,這裡作業系統一般而言包括核心和系統守護進程。