D-Bus
D-Bus 的英文全称是 Desktop Bus,从名字可以看出它最早是被设计用于桌面操作系统的通信总线,即桌面应用程序和操作系统内核间的通信。D-Bus 提供了一种进程间通信及远程过程调用机制,从而实现多个不同的应用程序在同一台电脑上同时进行通信。
D-Bus 作为 freedesktop.org 项目的一部分,其设计目的是使 Linux 桌面环境提供的服务标准化。同时,freedesktop.org 项目也开发了一个称为 libdbus 的自由及开放原始码软件库,作为规范的参考实现。因此,libdbus 库常与 D-Bus 本身混淆。当然,也存在着其他的 D-Bus 实现,例如 GDBus(GNOME),QtDBus(Qt),dbus-java 以及 sd-bus(systemd 的一部分)。
概述
D-Bus 可用于同一个桌面会话中不同桌面应用软件间的通信,能集成桌面会话,也解决了进程的生命周期的问题。它也允许桌面会话与操作系统间的通信,这通常包括了内核与任何的系统守护进程或一般进程间的通信。
当大量的程序进行通信时,由于程序跟程序之间必须创建起一对一的通信,则整体的通信网络将会非常复杂,而通信效率也会因此低下不可靠。D-Bus 提供了一个软件汇流抽象层,能够汇整所有的消息到一个虚拟的通信频道。连接到 D-Bus 的程序无法也无需知道 D-Bus 是如何操作,只需遵从 D-Bus 的标准,就能保证所有连接到 D-Bus 的程序能进行彼此间的交流。换句话说,D-Bus 是一个消息总线系统,即进程间通信的介质,让应用程序间可以通信并交换消息。
Linux 桌面环境通过实例化多个总线来利用 D-Bus 设施,特别是:
- 一个单一的系统总线,可供系统的所有用户和进程使用,它提供对系统服务(即操作系统和任何系统守护程序提供的服务)的访问;
- 每个用户登录会话的会话总线,为同一桌面会话中的用户应用程序提供桌面服务,并允许将桌面会话集成为一个整体。
一个进程可以连接到任意数量的 D-Bus 总线上,前提是它已被授予访问这些总线的权限。实际上,这意味着任何用户进程都可以连接到系统总线及其当前会话总线,但不能连接到另一个用户的会话总线,甚至不能连接到同一用户拥有的不同会话总线。如果将所有用户会话组合到单个用户总线中,则后一种限制可能会在未来发生变化。
利用 D-Bus 可以很方便地为应用程序增加新的功能,简化已有功能,包含信息分享、模块化及权限分离。例如当使用蓝牙接收到通话时,通知所有正在运行中的音乐播放器,使其静音或暂停播放,直到通话结束。
D-Bus 也可以用作框架来集成用户应用程序的不同组件。例如,办公套件可以通过会话总线进行通信,以在文字处理器和电子表格之间共享数据。
设计规范
总线模型
在 D-Bus 的上下文中,每个到总线的连接都通过所谓的总线名称来标识。总线名称由两个或两个以上点分隔的字母、数字、破 折号和下划线组成。有效总线名称的一个例子是 org.freedesktop.NetworkManager
。
当进程建立到总线的连接时,总线会为连接分配一个特殊的总线名称,称为唯一连接名称(unique connection name)。这种类型的总线名称是不可变的 —— 只要连接存在就保证它们不会改变,更重要的是,它们不能在总线生命周期内重复使用。这意味着与该总线的任何其他连接都不会分配这样唯一的连接名称,即使同一进程关闭与总线的连接并创建一个新连接也是如此。唯一的连接名称很容易识别,因为它们以冒号字符开头 —— 否则禁止使用。唯一连接名称的示例是 :1.1553
(冒号后面的字符没有特殊含义)。
一个进程可以为其连接请求额外的总线名称,前提是任何请求的名称尚未被另一个总线连接使用。在 D-Bus 的说法中,当一个总线名称被分配给一个连接时,就说该连接拥有该总线名称。从这个意义上说,一个总线名称不能同时由两个连接拥有。但是,与唯一的连接名称不同,如果它们可用,这些名称可以被重用 —— 一个进程可能会回收另一个进程释放的总线名称,无论该进程是有意还是无意释放。
这些额外的总线名称(通常称为众所周知的名称)背后的想法是提供一种使用预先安排的总线名称来引用服务的方法。例如,报告系统总线中当前时间和日期的服务位于其连接拥有 org.freedesktop.timedate1
总线名称的进程中,无论它是哪个进程。
总线名称可以作为实现单实例应用程序的一种简单方法(第二个实例检测总线名称已被使用)。它还可以用来跟踪服务进程的生命周期,因为当由于进程终止而释放总线名称时,总线会发送一个通知。