D-Bus
D-Bus是一个进程间通信及远程过程调用机制,可以让多个不同的计算机程序(即进程)在同一台计算机上同时进行通信。它作为freedesktop.org项目的一部分,其设计目的是使Linux桌面环境(如GNOME与KDE等)提供的服务标准化。D-Bus提供简便进程间通信的消息总线系统,包含一个能以全系统或者针对一个用户会话运行的守护进程,和一系列提供与 D-Bus 通信的库。采用C语言开发在GNU通用公共许可证第二版或更新,或是AFL 2.1协议下授权。
freedesktop项目同时也开发了一个称为libdbus的自由及开放源代码软件库,作为规范的参考实现。这个库常与D-Bus本身混淆,也存在着其他的D-Bus实现,像是GDBus (GNOME),QtDBus (Qt/KDE),dbus-java以及sd-bus(systemd的一部分)。来自 GNOME、KDE 以及 其他组织的对此感兴趣的成员参与了设计与实现。
D-BUS 本质上是进程间通信(inter-process communication)(IPC)的一个实现。不过有一些特性使其远远不是“只是另一个 IPC 实现”。有很多不同的 IPC 实现,因为每一个都定位于解决特定的明确定义的问题。CORBA 是用于面向对象编程中复杂的 IPC 的一个强大的解决方案。DCOP 是一个 较轻量级的 IPC 框架,功能较少,但是可以很好地集成到 KDE 桌面环境中。SOAP 和 XML-RPC 设计用于 Web 服务,因而使用 HTTP 作为其传输协议。D-BUS 设计用于桌面应用程序和 OS 通信。
D-Bus可用于同一个桌面会话中不同桌面应用软件间的通信,能集成桌面会话,也解决了进程的生命周期的问题。它也允许桌面会话与操作系统间的通信,这通常包括了内核与任何的系统守护进程或一般进程间的通信。D-Bus是一个消息总线系统,即进程间通信的介质,让应用程序间可以通信并交换消息。因此D-Bus为应用程序增加新的功能,简化已有功能,包含信息分享、模块化及权限分离。例如透过蓝牙或Skype所接收到的通话可以传播到任何当前运行中的音乐播放器,并可使其静音或暂停播放,直到通话结束。
大多数的系统会实现一个具较高权限的系统通道,连同给每一个已登录的用户的专用通道,这就可以让D-Bus中可用的登录信息受到限制。因此D-Bus服务同时包含了系统守护进程(给像是“新增硬件设备”或是“打印机队列变更”等事件使用)以及一个给每个用户的登录会话(给这个用户启动的进程间的一般通信使用)使用的独有守护进程。应用程序透过Unix域套接字与守护进程通信。消息总线是建基于通用的一对一消息传递框架,这让任意两个程序间可以不必透过消息总线守护进程而直接通信。
桌面应用程序通信
典型的桌面都会有多个应用程序在运行,而且,它们经常需要彼此进行通信。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 照相机)插入时会发放出一个信号。 这样可以更紧密地将硬件集成到桌面中,从而改善用户体验。 桌面环境和 xinitrc 会自动启动 D-Bus 会话。xorg-xinit 提供的框架文件 ~/.xinitrc (/etc/skel/.xinitrc) 也会执行同样的操作,请确保自己的 ~/.xinitrc 是基于框架文件 /etc/skel/.xinitrc。
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 的最高层次抽象,它们的实现当前还在不断发展变化。应用程序可以通过一个总线来注册一个服务,如果成功,则应用程序就已经获得了那个服务。其他应用程序可以检查在总线上是否已经存在一个特定的服务,如果没有可以要求总线启动它。服务抽象的细节 —— 尤其是服务活化 —— 当前正处于发展之中,应该会有变化。

dbus-daemon在现代的Linux图形化桌面环境中扮演相当重要的角色。
三个抽象层
libdbus —— 让两个应用程序可以互相链接并交换消息的库
dbus-daemon —— 消息总线的可执行档,建基于libdbus,可链接到多个应用程序。这个守护进程可以将消息按特定路径转送给零个或更多个应用程序,从而实现发布/订阅模式。
基于特定应用程序框架的封装库
接收到消息的D-Bus连线会被转送到一个特定的对象,而非进程。因此客户端只知道它们是与对象交互,但并不知道另一侧是否真的有对象。D-Bus为每个对象定义了一个名称,其看起来像是POSIX文件系统路径,但实际上并不是,例如/org/kde/kspread/sheets/3/cells/4/5。D-Bus对象的名称通常会使用名字空间以协助独立开发代码模块。名字空间一般会以开发者的保留域名组件作为前缀(例如/org/kde)。
实现
libdbus
虽然已经有多个D-Bus的实现,但其中使用最广泛的参考实现是libdbus,开发者就是设计规范的freedesktop.org项目。不过libdbus是一个低级的实现,并不会直接被应用程序开发者所使用,但是可作为其他D-Bus实现(像是包含在桌面环境的标准库中或是在编程语言绑扎中的实现)的参考指南。freedesktop.org项目自身建议应用程序的作者“使用较高端的绑扎或是实现”来替代。因为libdbus是最常被使用的D-Bus实现,术语"D-Bus"与"libdbus"经常互换使用,导致了混乱。
GDBus
GDBus是一个基于包含在GLib中的GIO流的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核心的特性中造成了不寻常的争议。
语言绑扎
已经有多个编程语言的D-Bus绑扎被开发出来。
参考来源
4. D-Bus 使用
D-Bus(维基百科)
使用 D-BUS 连接桌面应用程序
最新版本:1.12
项目主页:https://www.freedesktop.org/wiki/Software/dbus/
freedesktop项目同时也开发了一个称为libdbus的自由及开放源代码软件库,作为规范的参考实现。这个库常与D-Bus本身混淆,也存在着其他的D-Bus实现,像是GDBus (GNOME),QtDBus (Qt/KDE),dbus-java以及sd-bus(systemd的一部分)。来自 GNOME、KDE 以及 其他组织的对此感兴趣的成员参与了设计与实现。
D-BUS 本质上是进程间通信(inter-process communication)(IPC)的一个实现。不过有一些特性使其远远不是“只是另一个 IPC 实现”。有很多不同的 IPC 实现,因为每一个都定位于解决特定的明确定义的问题。CORBA 是用于面向对象编程中复杂的 IPC 的一个强大的解决方案。DCOP 是一个 较轻量级的 IPC 框架,功能较少,但是可以很好地集成到 KDE 桌面环境中。SOAP 和 XML-RPC 设计用于 Web 服务,因而使用 HTTP 作为其传输协议。D-BUS 设计用于桌面应用程序和 OS 通信。
D-Bus可用于同一个桌面会话中不同桌面应用软件间的通信,能集成桌面会话,也解决了进程的生命周期的问题。它也允许桌面会话与操作系统间的通信,这通常包括了内核与任何的系统守护进程或一般进程间的通信。D-Bus是一个消息总线系统,即进程间通信的介质,让应用程序间可以通信并交换消息。因此D-Bus为应用程序增加新的功能,简化已有功能,包含信息分享、模块化及权限分离。例如透过蓝牙或Skype所接收到的通话可以传播到任何当前运行中的音乐播放器,并可使其静音或暂停播放,直到通话结束。
大多数的系统会实现一个具较高权限的系统通道,连同给每一个已登录的用户的专用通道,这就可以让D-Bus中可用的登录信息受到限制。因此D-Bus服务同时包含了系统守护进程(给像是“新增硬件设备”或是“打印机队列变更”等事件使用)以及一个给每个用户的登录会话(给这个用户启动的进程间的一般通信使用)使用的独有守护进程。应用程序透过Unix域套接字与守护进程通信。消息总线是建基于通用的一对一消息传递框架,这让任意两个程序间可以不必透过消息总线守护进程而直接通信。
桌面应用程序通信
典型的桌面都会有多个应用程序在运行,而且,它们经常需要彼此进行通信。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 照相机)插入时会发放出一个信号。 这样可以更紧密地将硬件集成到桌面中,从而改善用户体验。 桌面环境和 xinitrc 会自动启动 D-Bus 会话。xorg-xinit 提供的框架文件 ~/.xinitrc (/etc/skel/.xinitrc) 也会执行同样的操作,请确保自己的 ~/.xinitrc 是基于框架文件 /etc/skel/.xinitrc。
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 的最高层次抽象,它们的实现当前还在不断发展变化。应用程序可以通过一个总线来注册一个服务,如果成功,则应用程序就已经获得了那个服务。其他应用程序可以检查在总线上是否已经存在一个特定的服务,如果没有可以要求总线启动它。服务抽象的细节 —— 尤其是服务活化 —— 当前正处于发展之中,应该会有变化。

dbus-daemon在现代的Linux图形化桌面环境中扮演相当重要的角色。
三个抽象层
libdbus —— 让两个应用程序可以互相链接并交换消息的库
dbus-daemon —— 消息总线的可执行档,建基于libdbus,可链接到多个应用程序。这个守护进程可以将消息按特定路径转送给零个或更多个应用程序,从而实现发布/订阅模式。
基于特定应用程序框架的封装库
接收到消息的D-Bus连线会被转送到一个特定的对象,而非进程。因此客户端只知道它们是与对象交互,但并不知道另一侧是否真的有对象。D-Bus为每个对象定义了一个名称,其看起来像是POSIX文件系统路径,但实际上并不是,例如/org/kde/kspread/sheets/3/cells/4/5。D-Bus对象的名称通常会使用名字空间以协助独立开发代码模块。名字空间一般会以开发者的保留域名组件作为前缀(例如/org/kde)。
实现
libdbus
虽然已经有多个D-Bus的实现,但其中使用最广泛的参考实现是libdbus,开发者就是设计规范的freedesktop.org项目。不过libdbus是一个低级的实现,并不会直接被应用程序开发者所使用,但是可作为其他D-Bus实现(像是包含在桌面环境的标准库中或是在编程语言绑扎中的实现)的参考指南。freedesktop.org项目自身建议应用程序的作者“使用较高端的绑扎或是实现”来替代。因为libdbus是最常被使用的D-Bus实现,术语"D-Bus"与"libdbus"经常互换使用,导致了混乱。
GDBus
GDBus是一个基于包含在GLib中的GIO流的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核心的特性中造成了不寻常的争议。
语言绑扎
已经有多个编程语言的D-Bus绑扎被开发出来。
参考来源
4. D-Bus 使用
D-Bus(维基百科)
使用 D-BUS 连接桌面应用程序
最新版本:1.12
项目主页:https://www.freedesktop.org/wiki/Software/dbus/