D-Bus

D-Bus是一個行程間通訊及远程过程调用機制，可以讓多個不同的计算机程序（即行程）在同一臺電腦上同時進行通訊。D-Bus作為freedesktop.org專案的一部份，其設計目的是使Linux桌面环境（如GNOME與KDE等）提供的服務標準化。 freedesktop.org專案同時也開發了一個稱為libdbus的自由及开放源代码软件函式庫，作為規範的參考實作。這個函式庫常與D-Bus本身混淆。也存在著其他的D-Bus實作，像是GDBus (GNOME)，QtDBus (Qt/KDE)，dbus-java以及sd-bus（systemd的一部份）。 D-Bus可用於同一個桌面会话中不同桌面应用软件間的通訊，能整合桌面会话，也解決了行程的生命週期的問題。它也允許桌面会话與操作系统間的通訊，這通常包括了内核與任何的系統守护进程或一般行程間的通訊。 當大量的程序進行通訊時，由於程序跟程序之間必須建立起一對一的通訊，則整體的通訊網路將會非常復雜，而通訊效率也會因此低下不可靠。D-Bus提供了一個軟體匯流（韃靼語：Software bus）抽象層，能夠匯整所有的訊息到一個虛擬的通訊頻道。連接到D-Bus的程序無法也無需知道D-Bus是如何實做，但是只要遵從D-Bus的標準，就能保證所有連接到D-Bus的程序能進行彼此間的交流。換句話說，D-Bus是一個訊息匯流排（英语：Message-oriented middleware）系統，即行程間通訊的媒介，讓應用程式間可以通訊並交換訊息。因此，D-Bus为應用程式增加新的功能，簡化已有功能，包含資訊分享、模組化及權限分離（英语：Privilege separation）。例如透過藍牙或Skype所接收到的通話可以傳播到任何目前執行中的音樂播放器，並可使其靜音或暫停播放，直到通話結束。 大多數的系統會實作一個具較高權限的系統頻道，連同給每一個已登入的使用者的專用頻道，這就可以讓D-Bus中可用的登錄資訊受到限制。因此，D-Bus服務同時包含了系統守護行程（給像是「新增硬體裝置」或是「印表機佇列變更」等事件使用）以及一個給每個使用者的登入会话（給这个使用者啟動的行程間的一般通訊使用）使用的獨有守护进程。應用程式透過Unix域套接字與守護行程通訊。訊息匯流排是建基於通用的一對一訊息傳遞框架，這讓任意兩個程式間可以不必透過訊息匯流排守護行程而直接通訊。 D-Bus有三個抽象層： libdbus —— 讓兩個應用程式可以互相連結並交換訊息的函式庫 dbus-daemon —— 訊息匯流排的可執行檔，建基於libdbus，可連結到多個應用程式。這個守護行程可以將訊息按特定路徑轉送給零個或更多個應用程式，從而實作发布/订阅模式。 基於特定應用程式框架的封裝函式庫 接收到訊息的D-Bus連線會被轉送到一個特定的物件，而非行程。因此，客戶端只知道它們是與物件互動，但並不知道另一側是否真的有物件。 D-Bus為每個物件定義了一個名稱，其看起來像是POSIX檔案系統路徑，但實際上並不是，例如/org/kde/kspread/sheets/3/cells/4/5。D-Bus物件的名稱通常會使用命名空间以協助獨立開發程式碼模組。命名空間一般會以開發者的保留域名組件作為前綴（例如/org/kde）。 KDE第二版與第三版使用的DCOP（英语：DCOP）系統对D-Bus有深刻影响，后者在KDE 4中取代了前者。D-Bus的實作支援大多數的POSIX作業系統，也有一個Windows的移植。它也在Qt 4、GNOME及Xfce中使用。在GNOME中，它已逐漸取代了早期的Bonobo（英语：Bonobo (component model)）機制。 D-Bus最初用于桌面環境，后来使用範圍逐漸扩展，包含的系統服務越來越多。例如NetworkManager網路守護行程、BlueZ藍牙堆疊及PulseAudio音訊伺服器都使用D-Bus來提供其部份或全部的服務，systemd也正促使傳統的系統守護行程（如logind）轉換到D-Bus服務。[來源請求] 它也用于AllJoyn協定在家庭自動化中的導線協定（英语：Wire protocol），為AllJoyn加入了探索、工作階段管理、安全、標頭壓縮、嵌入式裝置支援。 libdbus 雖然已經有多個D-Bus的實作，但其中使用最廣泛的參考實作是libdbus，開發者就是設計規範的freedesktop.org專案。不过libdbus是一個低階的實作，並不會直接被應用程式開發者所使用，但是可作為其他D-Bus實作（像是包含在桌面環境的標準函式庫中或是在编程语言綁紮中的實作）的參考指南。freedesktop.org專案自身建議應用程式的作者「使用較高階的綁紮或是實作」來替代。 因為libdbus是最常被使用的D-Bus實作，術語"D-Bus"與"libdbus"經常互換使用，導致了混亂。 GDBus GDBus是一個基於包含在GLib中的GIO串流（英语：GIO (software)）的D-Bus實作，其致力於讓GTK+與GNOME使用。GDBus並不是libdbus的封裝，而是一個完整且獨立的D-Bus規範與協定的重新實作。 QtDBus QtDBus是一個自4.2版開始，包含於Qt函式庫的D-Bus實作。這個組件也被KDE的應用程式、函式庫及組件用於存取在系統中所提供的D-Bus服務。 sd-bus 2013年時，systemd專案重寫了libdbus，並努力簡化程式碼，它也使得D-Bus的整體效能有所提升。在先前的測試中，BMW發現systemd的D-Bus函式庫效能增長了360%。 而到了221版本的systemd，sd-bus的应用程序接口（英語：API）已被宣告為穩定 kdbus 另外還有一個積極開發中的專案，稱為kdbus，其致力於重新實作D-Bus為核心中介的點對點行程間通訊機制。除了效能的提升，kdbus也受益於已經存在的Linux内核特性，像是命名空間、審核機制、核心傳遞的安全特性、終止競爭條件等，並讓D-Bus可以在開機與關機時使用（此時需要systemd）。但kdbus在Linux核心的特性中造成了不尋常的爭議，是以截至2015年6月 (2015-06)[update]都尚未被合併。 語言綁紮 已經有多個程式語言的D-Bus綁紮被開發出來，像是 Java、C♯、Ruby以及Python等的綁紮均已存在。 自由软件主题 桌面應用的Linux 通用语言架构 CORBA 组件对象模型 Distributed COM Java远程方法调用 遠程過程調用 XPCOM Simon McVittie. Announcing dbus 1.14.0 (new stable branch). 2022-02-28 [2022-02-28]. （原始内容存档于2022-03-01）.  Simon McVittie. Announcing dbus 1.13.22 (1.14.0 release candidate). 2022-02-23 [2022-02-23]. （原始内容存档于2022-02-28）.  havoc. GPL + AFL. Havoc's Blog. 2007-07-17 [2015-08-27]. （原始内容存档于2015-09-07）.  Cocagne, Tom. DBus Overview. pythonhosted.org. [2015-05-23]. （原始内容存档于2015-06-08）.  gdbus. GNOME developer. GNOME project. [2015-01-04]. （原始内容存档于2015-01-05）.  QtDBus module. Qt專案. Qt專案. [2015-06-01]. （原始内容存档于2015-05-06）.  DBus-Java Documentation. FreeDesktop.org. [2015-01-04]. （原始内容存档于2014-12-23）.  The new sd-bus API of systemd. 2015-06-19 [2015-06-20]. （原始内容存档于2015-06-22）.  Robert Love. Get on the D-BUS. Linux Journal. 2005-01-05 [2014-10-14]. （原始内容存档于2014-10-20）.  dbus: What is D-Bus?. freedesktop.org. 2014-01-20 [2014-10-14]. （原始内容存档于2014-10-18）.  D-Bus Tutorial. [2015-08-28]. （原始内容存档于2015-08-28）.  Difference from D-Bus?. Allseen Alliance. 2013-12-11 [2015-08-27]. （原始内容存档于2015-07-21）.  What is D-Bus?. FreeDesktop.org. [2015-01-05]. （原始内容存档于2015-01-05）.  Migrating to GDBus. GNOME Developer. [2015-06-16]. （原始内容存档于2015-09-06）.  Poettering, Lennart. libsystemd-bus + kdbus plans. systemd-devel mailing list. [2015-04-24]. （原始内容存档于2019-06-24）.  ALS: Linux inter-process communication and kdbus. LWN.net. 2013-05-30 [2013-11-13]. （原始内容存档于2013-11-13）.  [systemd-devel] [ANNOUNCE] systemd v221. freedesktop.org. 2015-06-19 [2015-06-20]. （原始内容存档于2015-06-20）.  Jake Edge. ALS: Linux interprocess communication and kdbus. LWN.net. 2013-05-30 [2014-04-11]. （原始内容存档于2014-04-09）.  Jonathan Corbet. The unveiling of kdbus. LWN.net. 2014-01-13 [2014-04-11]. （原始内容存档于2014-04-09）.  Greg Kroah-Hartman. [GIT PULL] kdbus for 4.1-rc1. 2015-04-13 [2015-08-28]. （原始内容存档于2015-07-01）.  Corbet, Jonathan. The kdbuswreck. LWN.Net. [2015-06-29]. （原始内容存档于2015-06-24）.  Michael Larabel. It Doesn't Look Like KDBUS Will Make It For Linux 4.1. Phoronix. 2015-04-26 [2015-08-28]. （原始内容存档于2015-09-05）.  D-Bus Bindings. FreeDesktop.org. [2015-01-05]. （原始内容存档于2014-12-24）.  D-Bus（页面存档备份，存于互联网档案馆）在Freedesktop.org上的首頁 D-Bus的簡介（页面存档备份，存于互联网档案馆）在Freedesktop.org的wiki上