DBUS简介
D-Bus 是 Freedesktop.org 项目开发的一种系统间消息传递机制,用于系统中不同进程间进行通信问题。
在 Linux 桌面系统中,应用程序通常需要与其他应用程序进行通信,例如播放器需要与音频设备进行通信,桌面环境需要与屏幕保护程序进行通信。传统上,应用程序间通信通常使用共享内存、信号量、管道、socket等方式进行。这些方式存在一些问题,例如:
- 通信方式不统一,需要应用程序自行实现通信接口,增加了开发复杂度和维护成本。D-Bus基于unix socket,提供了统一的通信开发框架。该框架支持多种开发语言,可以更加便捷地实现进程间的通信。
- 通信效率较低,影响系统性能。D-Bus 采用高效的消息传递机制,传统的RPC方案,免不了需要对数据进行序列化和反序列化操作,而D-Bus没有这一操作,减少了数据解析成本,以及序列化操作所带来的数据负载,可以有效提升系统性能。
- 动态注册注销机制:D-Bus 采用动态注册注销机制,可以动态注册注销服务,实现服务的动态加载或卸载。
D-Bus 通信模型
- D-Bus 通信模型
- Method Call过程
D-Bus 基本概念
消息总线
- 系统总线:系统级的通信通道,用于操作系统的核心部分和系统级服务。随系统启动而启动,持久的。它主要用于系统服务之间的交流,如硬件状态的变更、系统设置的更新等。
- 会话总线:用户会话级的通信通道,用于同一用户会话中运行的应用程序。
总线名(Bus Name)
总线名是服务注册到总线的名称,总线名又分为两类:
Unique name 以:开始,Unique name是dbus-daemon分配的,类似于:1.30,技术规范明确要求其永不重复
Well Known name 为了方便人脑记忆引入的名字。为了命名不冲突,技术规范推荐使用逆转域名方式命名,例如org.freedesktop.DBus
对象(Object Path)
一个进程可以包含多个对象,D-Bus用Object path来标识对象,一般以/org/freedesktop/DBus这种形式命名。
接口(Interface)
Interface包含方法(Method)、属性(Property)和信号(Signal),以org.freedesktop.DBus这种形式命名。
方法(Method)
方法,程序可以通过D-Bus提供的机制,调用另外一个进程提供的Method,即RPC的概念
信号(Signal)
信号,D-Bus中Pub-Sub通信模型的具体实现。
属性(Property)
属性,类似于C++类中成员变量的Getter-Setter,可以定义为只读、只写、读写类型。
签名字符串(Signature)
D-Bus技术规范规定使用String类型来编码方法、信号的签名(参数)。例如i代表int32_t类型,a代表数组等等。
消息类型
连接到总线的进程可通过总线接收或传递消息,总线收到消息时,根据不同的消息类型进行不同的处理。D-Bus中消息分为四类: