基于Dbus的进程间通讯
D-Bus简介
- 支持进程间一对一和多对多的对等通信, 在多对多情况需要后台进程去分转消息
- 后台进程充当着一个路由器的角色
- 在DBUS通信过程中,存在一个后台进程(BUS Daemon Process), 后台进程和普通进程间信息交互是通过域套接字进行通信
- 连接到总线的进程可通过总线接收或传递消息,总线收到消息时,根据不同的消息类型进行不同的处理, DBUS中消息分为四类:
(1) Methodcall消息:将触发一个函数调用 ;
(2) Methodreturn消息:触发函数调用返回的结果 ;
(3) Error消息:触发的函数调用返回一个异常 ;
(4) Signal消息:通知,可以看作为事件消息 ;- DBus 处理流程如下
D-Bus是用于进程间通信(IPC)的系统。从体系结构上讲,它分为几层:
- libdbus,该库允许两个应用程序相互连接并交换消息
- 支持一对一连接
- 消息总线守护程序(基于libdbus构建)
- 多个应用程序可以连接到该可执行文件
- 守护程序可以将消息从一个应用程序路由到其他应用程序
- 守护程序构成了一个轮毂。轮毂的每个辐条都是使用libdbus与应用程序的一对一连接。应用程序通过其分支将消息发送到总线守护程序,然后总线守护程序将消息转发到其他已连接的应用程序。将守护程序视为路由器。
- 包装库或基于特定应用程序框架的绑定, 如 libdbus-glib和libdbus-qt。
- 简化了D-Bus编程的细节
- libdbus 大部分的API仅用于绑定
D-Bus 应用
D-Bus设计用于两种特定情况:
- 同一桌面会话中桌面应用程序之间的通信;以允许整个桌面会话的集成,并解决流程生命周期的问题(桌面组件何时启动和停止运行).
- 桌面会话与操作系统之间的通信,其中操作系统通常包括内核以及任何系统守护程序或进程 .
D-Bus 信号
- DBus中的信号包含一条消息,该消息由一个进程发送到任意数量的其他进程。即,信号是单向广播。该信号可能包含自变量(数据有效负载),由于是广播,因此它永远不会有“返回值”, 将此与方法调用进行对比,其中方法调用消息具有匹配的方法回复消息。
- 信号的发射器不知道信号接收器。收件人在总线守护程序中注册,以根据“匹配规则”接收信号 - 这些规则通常包括发送方和信号名称。总线守护程序仅将每个信号发送给已对该信号表示兴趣的收件人。
D-Bus 方法调用
- 由两条消息组成
- 从过程A发送到过程B的方法调用消息
- 从过程B发送到过程A的匹配方法应答消息
- 调用和应答消息都通过总线守护程序路由, 呼叫者在每个呼叫消息中都包含一个不同的序列号,而回复消息中包含此号码,以使呼叫者能够将对呼叫的答复进行匹配。
- 方法调用消息发送到总线守护程序, 总线守护程序查看目标总线名称。如果某个进程拥有该名称,则总线守护程序会将方法调用转发给该进程。否则,总线守护程序将创建一条错误消息,并将其作为对方法调用消息的答复发送回去。