D-Bus
开发者 | 红帽公司及社群 |
---|---|
当前版本 | 1.14.0[1](2022年2月28日 ) |
预览版本 | 1.13.22[2](2022年2月23日 ) |
源代码库 | |
编程语言 | C |
操作系统 | 跨平台 |
类型 | |
许可协议 | GNU通用公共许可证第二版或更新,或是AFL 2.1[3] |
网站 | www |
D-Bus是一个行程间通讯及远程过程调用机制,可以让多个不同的计算机程序(即行程)在同一台电脑上同时进行通讯[4]。D-Bus作为freedesktop.org专案的一部份,其设计目的是使Linux桌面环境(如GNOME与KDE等)提供的服务标准化。
freedesktop.org专案同时也开发了一个称为libdbus的自由及开放源代码软件函式库,作为规范的参考实作。这个函式库常与D-Bus本身混淆。也存在著其他的D-Bus实作,像是GDBus (GNOME)[5],QtDBus (Qt/KDE)[6],dbus-java[7]以及sd-bus(systemd的一部份)[8]。
概观
[编辑]D-Bus可用于同一个桌面会话中不同桌面应用软件间的通讯,能整合桌面会话,也解决了行程的生命周期的问题。它也允许桌面会话与操作系统间的通讯,这通常包括了内核与任何的系统守护进程或一般行程间的通讯。
当大量的程序进行通讯时,由于程序跟程序之间必须建立起一对一的通讯,则整体的通讯网路将会非常复杂,而通讯效率也会因此低下不可靠。D-Bus提供了一个软体汇流抽象层,能够汇整所有的讯息到一个虚拟的通讯频道[4]。连接到D-Bus的程序无法也无需知道D-Bus是如何实做,但是只要遵从D-Bus的标准,就能保证所有连接到D-Bus的程序能进行彼此间的交流。换句话说,D-Bus是一个讯息汇流排系统,即行程间通讯的媒介,让应用程式间可以通讯并交换讯息。因此,D-Bus为应用程式增加新的功能,简化已有功能,包含资讯分享、模组化及权限分离。例如透过蓝牙或Skype所接收到的通话可以传播到任何目前执行中的音乐播放器,并可使其静音或暂停播放,直到通话结束[9]。
大多数的系统会实作一个具较高权限的系统频道,连同给每一个已登入的使用者的专用频道,这就可以让D-Bus中可用的登录资讯受到限制。因此,D-Bus服务同时包含了系统守护行程(给像是“新增硬体装置”或是“印表机伫列变更”等事件使用)以及一个给每个使用者的登入会话(给这个使用者启动的行程间的一般通讯使用)使用的独有守护进程。应用程式透过Unix域套接字与守护行程通讯。讯息汇流排是建基于通用的一对一讯息传递框架,这让任意两个程式间可以不必透过讯息汇流排守护行程而直接通讯[10]。
内部
[编辑]- libdbus —— 让两个应用程式可以互相连结并交换讯息的函式库
- dbus-daemon —— 讯息汇流排的可执行档,建基于
libdbus
,可连结到多个应用程式。这个守护行程可以将讯息按特定路径转送给零个或更多个应用程式,从而实作发布/订阅模式。 - 基于特定应用程式框架的封装函式库
接收到讯息的D-Bus连线会被转送到一个特定的物件,而非行程。因此,客户端只知道它们是与物件互动,但并不知道另一侧是否真的有物件。
D-Bus为每个物件定义了一个名称,其看起来像是POSIX档案系统路径,但实际上并不是,例如/org/kde/kspread/sheets/3/cells/4/5。D-Bus物件的名称通常会使用命名空间以协助独立开发程式码模组[11]。命名空间一般会以开发者的保留域名组件作为前缀(例如/org/kde)。
采用
[编辑]KDE第二版与第三版使用的DCOP系统对D-Bus有深刻影响,后者在KDE 4中取代了前者。D-Bus的实作支援大多数的POSIX作业系统,也有一个Windows的移植。它也在Qt 4、GNOME及Xfce中使用。在GNOME中,它已逐渐取代了早期的Bonobo机制。
D-Bus最初用于桌面环境,后来使用范围逐渐扩展,包含的系统服务越来越多。例如NetworkManager网路守护行程、BlueZ蓝牙堆叠及PulseAudio音讯伺服器都使用D-Bus来提供其部份或全部的服务,systemd也正促使传统的系统守护行程(如logind)转换到D-Bus服务。[来源请求]
它也用于AllJoyn协定在家庭自动化中的导线协定,为AllJoyn加入了探索、工作阶段管理、安全、标头压缩、嵌入式装置支援[12]。
实作
[编辑]- libdbus
- 虽然已经有多个D-Bus的实作,但其中使用最广泛的参考实作是libdbus,开发者就是设计规范的freedesktop.org专案。不过libdbus是一个低阶的实作,并不会直接被应用程式开发者所使用,但是可作为其他D-Bus实作(像是包含在桌面环境的标准函式库中或是在编程语言绑扎中的实作)的参考指南。freedesktop.org专案自身建议应用程式的作者“使用较高阶的绑扎或是实作”来替代[13]。
- 因为libdbus是最常被使用的D-Bus实作,术语"D-Bus"与"libdbus"经常互换使用,导致了混乱。
- GDBus
- GDBus[5]是一个基于包含在GLib中的GIO串流的D-Bus实作,其致力于让GTK+与GNOME使用。GDBus并不是libdbus的封装,而是一个完整且独立的D-Bus规范与协定的重新实作[14]。
- sd-bus
- 2013年时,systemd专案重写了libdbus,并努力简化程式码[15],它也使得D-Bus的整体效能有所提升。在先前的测试中,BMW发现systemd的D-Bus函式库效能增长了360%[16]。 而到了221版本的systemd,sd-bus的应用程序接口(英语:API)已被宣告为稳定[17]
- kdbus
- 另外还有一个积极开发中的专案,称为kdbus,其致力于重新实作D-Bus为核心中介的点对点行程间通讯机制。除了效能的提升,kdbus也受益于已经存在的Linux内核特性,像是命名空间、审核机制[18][19]、核心传递的安全特性、终止竞争条件等,并让D-Bus可以在开机与关机时使用(此时需要systemd)[20]。但kdbus在Linux核心的特性中造成了不寻常的争议[21],是以截至2015年6月[update]都尚未被合并[22]。
参见
[编辑]参考资料
[编辑]- ^ 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).
- ^ 4.0 4.1 Cocagne, Tom. DBus Overview. pythonhosted.org. [2015-05-23]. (原始内容存档于2015-06-08).
- ^ 5.0 5.1 gdbus. GNOME developer. GNOME project. [2015-01-04]. (原始内容存档于2015-01-05).
- ^ 6.0 6.1 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).
- ^ 9.0 9.1 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).