首页 科技 军事 财经 教育 体育 房产 健康 汽车 安全 热点 人才 推选

财经

旗下栏目:

Qt高级——D-Bus快速入门

发布时间:2019-09-29 来源:原创/投稿/转载 作者:admin 人气:

  D-Bus是Desktop Bus的缩写,是针对桌面环境优化的IPC(InterProcess Communication)机制,用于进程间的通信或进程与内核的通信。D-Bus是为Linux系统开发的进程间通信(IPC)和远程过程调用(RPC)机制,使用统一的通信协议来代替现有的各种IPC解决方案。D-Bus允许系统级进程(如:打印机和硬件驱动服务)和普通用户进程进行通信。D-Bus使用一个快速的二进制消息传递协议,D-Bus协议的低延迟和低消耗特点适用于同一台机器的通信。D-Bus的规范目前由目定义,可供所有团体使用。D-Bus不和低层的IPC直接竞争,比如sockets,shared memory或message queues。低层IPC有自己的特点,和D-Bus并不冲突。与其他重量级的进程间通信技术不同,D-Bus是非事务的。D-Bus使用了状态以及连接的概念,比UDP等底层消息传输协议更“聪明”。但另一方面,D-Bus传送的是离散消息,与TCP协议将数据看做“流”有所不同。D-Bus支持点对点的消息传递以及广播/订阅式的通信。

  不同IPC通信机制的特点如下:A、CORBA是用于面向对象编程中复杂IPC的一个强大的解决方案。B、Bonobo是一个只用于GNOME的解决方案,基于CORBA并依赖于GObject。C、DCOP是一个较轻量级的IPC框架,功能较少,但可以很好地集成到KDE桌面环境中。D、SOAP和XML-RPC设计用于Web服务,因而使用HTTP作为其传输协议。E、D-BUS设计用于桌面应用程序和OS通信。

  A、D-BUS的协议是低延迟而且低开销的,设计小巧且高效,以便最小化传送时间。从设计上避免往返交互并允许异步操作。B、协议是二进制的,而不是文本,排除序列化过程。C、考虑了字节序问题。D、易用性:按照消息而不是字节流来工作,并且自动地处理了许多困难的IPC问题,并且D-Bus库以可以封装的方式来设计,开发者可以使用框架里存在的对象/类型系统,而不用学习一种新的专用于IPC的对象/类型系统。E、请求时启动服务以及安全策略。F、支持多语言(C/C++/Java/C#/Python/Ruby),多平台(Linux/windows/maemo)。G、采用C语言,而不是C++。H、由于基本上不用于internet上的IPC,因此对本地IPC进行了特别优化。I、提供服务******,理论上可以进行无限扩展。

  A、接口层——接口层由libdbus库提供,进程通过libdbus库使用D-Bus的能力。通过底层库的接口可以实现两个进程之间进行连接并发送消息。B、总线层——由消息总线守护进程(message bus daemon )提供,消息总线守护进程是基于libdbus底层库的,可以路由消息。消息总线守护进程负责进程间的消息路由和传递,其中包括Linux内核和Linux桌面环境的消息传递。C、封装层——封装层是一系列基于特定应用程序框架的Wrapper库,将D-Bus底层接口封装成方便用户使用的通用API。

  libdbus只支持点对点的通信,即只支持一进程与另外的一个进程进行通信。通信是基于消息的,消息包含头部和消息体。libdbus提供C语言的底层API,API是为了将D-Bus绑定到特定的对象或是语言而设计的,官方文档中建议不要在应用上直接使用D-Bus的底层接口,推荐使用D-Bus的绑定,如QtDBus、GDBus、dbus-c++等实现。

  D-Bus总线层由消息总线守护进程(message bus daemon )提供。消息总线守护进程是一个后台进程,是/usr/bin/dbus-daemon的一个运行实例,  负责消息的转发,dbus-daemon运行时会调用libdus的库。应用程序调用特定的应用程序框架的Wrapper库与dbus-daemon进行通信。应用程序通过D-Bus与其它进程通信必须先建立到消息总线守护进程实例的连接。最常见的基于dbus的程序也符合C/S结构。比如开发两个程序A和B,其中A是客户端,B是服务端。假设A要调用B的一个函数func,那么实际的消息流动方向是:A告诉dbus-daemon请求要调用B的func函数,然后dbus-daemon去调用B的func函数,如果func有返回值的话,B会把返回值告诉dbus-daemon,然后dbus- daemon再把返回值告诉A。如果B进程还没有启动,则dbus-daemon会自动的先把B进程启动起来。通常情况下,Linux会有两个dbus-daemon进程,一个属于system,一个属于session,在用户******的时候由dbus-launch启动。大多数普通程序,都是使用session的dbus-daemon,默认情况下,A就是将消息发给属于session的dbus-daemon。dbus-daemon是有******的,环境变量DBUS_SESSION_BUS_ADDRESS用于表示当前******用户的session的dbus-daemon进程的******,可以使用echo $DBUS_SESSION_BUS_ADDRESS查看。

责任编辑:admin