D-Bus 通信模型

D-Bus 被认为是一个通用的、高级的进程间通信系统。为了实现这些目标,D-Bus 通信基于进程之间的消息交换而不是“原始字节”(raw bytes)。D-Bus 消息是一个进程可以通过总线发送到另一个连接的进程的高级离散项。消息具有明确定义的结构(甚至定义了其有效负载中携带的数据类型),允许总线验证它们并拒绝任何格式不正确的消息。在这方面,D-Bus 更接近于 RPC 机制,而不是经典的 IPC 机制,具有自己的类型定义系统和自己的封送处理。

总线支持在客户端和服务进程之间交换消息的两种模式:

  • 一对一的请求-响应:这是客户端调用对象方法的方式。客户端向导出对象的服务进程发送一条消息,服务反过来用一条消息回复客户端进程。客户端发送的消息必须包含对象路径、调用方法的名称(以及可选的接口名称)以及由对象选择的接口定义的输入参数的值(如果有的话)。回复消息携带请求的结果,包括对象的方法调用返回的输出参数的值,或者如果出现错误则异常信息。
  • 发布/订阅:这是对象向相关方宣布信号发生的方式。对象的服务进程广播一条消息,总线只传递给订阅对象信号的连接客户端。消息携带对象路径、信号名称、信号所属的接口以及信号参数的值(如果有)。通信是单向的:没有来自任何客户端进程的原始消息的响应消息,因为发送者既不知道身份也不知道接收者的数量。

每个 D-Bus 消息都由一个标头和一个主体组成。标头由几个字段组成,这些字段标识消息的类型、发送者以及将消息传递给其接收者所需的信息(目标总线名称、对象路径、 方法或信号名称、接口名称等)。正文包含接收器进程解释的数据有效负载 —— 例如输入或输出参数。所有数据都以众所周知的二进制格式编码,称为有线格式(wire format),它支持各种类型的序列化,例如整数和浮点数、字符串、复合类型等,也称为封送处理。

D-Bus 规范定义了有线协议:如何构建要在 D-Bus 连接内的进程之间交换的 D-Bus 消息。但是,它没有定义传递这些消息的底层传输方法。