訊息匯流排和活動系統滲透到Linux桌面(轉)

BSDLite發表於2007-08-11
訊息匯流排和活動系統滲透到Linux桌面(轉)[@more@]  D-BUS 是一個大有前途的訊息匯流排和活動系統,正開始深入地滲透到 Linux® 桌面之中。瞭解建立它的原因、它的用途以及發展前景。
  
  D-BUS 本質上是 程式間通訊(inter-process communication)(IPC)的一個實現。不過,有一些特性使得 D-BUS 遠遠不是“只是另一個 IPC 實現”。有很多不同的 IPC 實現,因為每一個都定位於解決特定的明確定義的問題。CORBA 是用於物件導向程式設計中複雜的 IPC 的一個強大的解決方案。DCOP 是一個較輕量級的 IPC 框架,功能較少,但是可以很好地整合到 K 桌面環境中。SOAP 和 XML-RPC 設計用於 Web 服務,因而使用 HTTP 作為其傳輸協議。D-BUS 設計用於桌面應用程式和 OS 通訊。
  
  桌面應用程式通訊
  典型的桌面都會有多個應用程式在執行,而且,它們經常需要彼此進行通訊。DCOP 是一個用於 KDE 的解決方案,但是它依賴於 Qt,所以不能用於其他桌面環境之中。類似的,Bonobo 是一個用於 GNOME 的解決方案,但是非常笨重,因為它是基於 CORBA 的。它還依賴於 GObject,所以也不能用於 GNOME 之外。 D-BUS 的目標是將 DCOP 和 Bonobo 替換為簡單的 IPC,並整合這兩種桌面環境。由於儘可能地減少了 D-BUS 所需的依賴,所以其他可能會使用 D-BUS 的應用程式不用擔心引入過多依賴。
  
  桌面/作業系統通訊
  術語“作業系統”在這裡不僅包括核心,還包括系統後臺程式。例如,透過使用 D-BUS 的 udev(Linux 2.6 中取代 devfs 的,提供動態 /dev 目錄),當裝置(比如一個 USB 照相機)插入時會發放出一個訊號。這樣可以更緊密地將硬體整合到桌面中,從而改善使用者體驗。
  
  D-BUS 特性
  D-BUS 有一些有趣的特性,使其像是一個非常有前途的選擇。
  
  協議是低延遲而且低開銷的,設計得小而高效,以便最小化傳送的往返時間。另外,協議是二進位制的,而不是文字的,這樣就排除了費時的序列化過程。由於只面向本地機器處理的使用情形,所以所有的訊息都以其自然位元組次序傳送。位元組次序在每個訊息中宣告,所以如果一個 D-BUS 訊息透過網路傳輸到遠端的主機,它仍可以被正確地識別出來。
  
  從開發者的角度來看,D-BUS 是易於使用的。有線協議容易理解,客戶機程式庫以直觀的方式對其進行包裝。
  
  程式庫還設計用於為其他系統所包裝。預期,GNOME 將使用 GObject 建立包裝 D-BUS 的包裝器(實際上這些已經部分存在了,將 D-BUS 整合入它們的事件迴圈),KDE 將使用 Qt 建立類似的包裝器。由於 Python 具有物件導向特性和靈活的型別,已經有了具備類似介面的 Python 包裝器。
  
  最後,D-BUS 正在 freedesktop.org 的保護下進行開發,在那裡,來自 GNOME、KDE 以及其他組織的對此感興趣的成員參與了設計與實現。
  
  D-BUS 的內部工作方式
  典型的 D-BUS 設定將由幾個匯流排構成。將有一個持久的 系統匯流排(system bus),它在引導時就會啟動。這個匯流排由作業系統和後臺程式使用,安全性非常好,以使得任意的應用程式不能欺騙系統事件。還將有很多 會話匯流排(session buses),這些匯流排當使用者登入後啟動,屬於那個使用者私有。它是使用者的應用程式用來通訊的一個會話匯流排。當然,如果一個應用程式需要接收來自系統匯流排的訊息,它不如直接連線到系統匯流排 —— 不過,它可以傳送的訊息將是受限的。
  
  一旦應用程式連線到了一個匯流排,它們就必須透過新增 匹配器(matchers) 來宣告它們希望收到哪種訊息。匹配器為可以基於介面、物件路徑和方法進行接收的訊息指定一組規則(見後)。這樣就使得應用程式可以集中精力去處理它們想處理的內容,以實現訊息的高效路由,並保持匯流排上訊息的預期數量,以使得不會因為這些訊息導致所有應用程式的效能下降並變得很慢。
  
  物件
  本質上,D-BUS 是一個對等(peer-to-peer)的協議 —— 每個訊息都有一個源和一個目的。這些地址被指定為 物件路徑。概念上,所有使用 D-BUS 的應用程式都包括一組 物件,訊息傳送到或者傳送自特定物件 —— 不是應用程式 —— 這些物件由物件路徑來標識。
  
  另外,每個物件都可以支援一個或多個 介面(interfaces)。這些介面看起來類似於 Java 中的介面或者 C++ 中的純粹的虛類(pure virtual classes)。不過,沒有選項來檢查物件是否實現了它們所宣告的介面,而且也沒有辦法可以調查物件內部以使列出其支援的介面。介面用於名稱空間和方法名稱,因此一個單獨的物件可以有名稱相同而介面不同的多個方法。
  
  訊息
  在 D-BUS 中有四種型別的訊息:方法呼叫(method calls)、方法返回(method returns)、訊號(signals)和錯誤(errors)。要執行 D-BUS 物件的方法,您需要向物件傳送一個方法呼叫訊息。它將完成一些處理並返回一個方法返回訊息或者錯誤訊息。訊號的不同之處在於它們不返回任何內容:既沒有“訊號返回”訊息,也沒有任何型別的錯誤訊息。
  
  訊息也可以有任意的引數。引數是強型別的,型別的範圍是從基本的非派生型別(布林(booleans)、位元組(bytes)、整型(integers))到高層次資料結構(字串(strings)、陣列( arrays)和字典(dictionaries))。
  
  服務
  服務(Services) 是 D-BUS 的最高層次抽象,它們的實現當前還在不斷髮展變化。應用程式可以透過一個匯流排來註冊一個服務,如果成功,則應用程式就已經 獲得 了那個服務。其他應用程式可以檢查在匯流排上是否已經存在一個特定的服務,如果沒有可以要求匯流排啟動它。服務抽象的細節 —— 尤其是服務活化 —— 當前正處於發展之中,應該會有變化。
  
  用例
  儘管 D-BUS 相對較新,但是卻迅速地得到了採用。如前所述,可以構建具有 D-BUS 支援的 udev 以使得當熱插拔(hot-plug)裝置時它可以傳送一個訊號。任何應用程式都可以偵聽這些事件並當接收到這些事件時執行動作。例如,gnome-volume-manager 可以檢測到 USB 儲存棒的插入並自動掛載它;或者,當插入一個數位相機時它可以自動下載照片。
  
  一個更為有趣但很不實用的例子是 Jamboree 和 Ringaling 的結合。Jamboree 是一個簡單的音樂播放器,它具有 D-BUS 介面,以使得它可以被告知播放、到下一首歌、改變音量等等。Ringaling 是一個小程式,它開啟 /dev/ttyS0(一個串列埠)並觀察接收到的內容。當 Ringaling 發現文字“RING”時,就透過 D-BUS 告知 Jamboree 減小音量。最終的結果是,如果您的計算機上插入了一個調變解調器,而且電話鈴響,則音樂音量就會為您減小。這 正是計算機所追求的!
  
  程式碼示例
  現在,讓我們來接觸一些使用 D-BUS 程式碼的示例。
  
  dbus-ping-send.c 每秒透過會話匯流排傳送一個引數為字串“Ping!”的訊號。我使用 Glib 來管理匯流排,以使得我不需要自己來處理匯流排的連線細節。
  
  清單 1. dbus-ping-send.c
  
  
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-946630/,如需轉載,請註明出處,否則將追究法律責任。

訊息匯流排和活動系統滲透到Linux桌面(轉)
請登入後發表評論 登入
全部評論

相關文章