D-Bus三层架构

D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信。它是个3层架构的IPC 系统,包括:

1、函数库libdbus ,用于两个应用程序互相联系和交互消息。

2、一个基于libdbus构造的消息总线守护进程,可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。

3、基于特定应用程序框架的封装库或捆绑(wrapper libraries or bindings )。例如,libdbus-glib和libdbus-qt,还有绑定在其他语言,例如Python的。大多数开发者都是使用这些封装库的API,因为它们简化了D-Bus编程细节。libdbus被有意设计成为更高层次绑定的底层后端(low-levelbackend )。大部分libdbus的 API仅仅是为了用来实现绑定。

D-Bus进程通信简单框架


DBUS中消息分为四类:

1.  Methodcall消息:将触发一个函数调用 ;

2.  Methodreturn消息:触发函数调用返回的结果;

3.  Error消息:触发的函数调用返回一个异常 ;

4.  Signal消息:通知,可以看作为事件消息。


2.2 连接到总线
     进程间通信前,需要连接到总线。调用dbus_bus_get函数连接进程到总线,建立进程和总线之间的连接(DBusConnection)。建立连接后,需要为这个连接注册名称,方便后面对这个连接进行操作,调用dbus_bus_request_name函数对连接进行注册名称。

建立连接和注册名称是在程序开始时执行,程序结束时,调用dbus_connection_close函数关闭一个连接。函数接口声明如程序清单 2‑1所示。

程序清单 2-1 建立、注册名称和关闭连接

DBusConnection  *dbus_bus_get  (DBusBusType  type,  DBusError   *error)             /*  建立和总线的连接  */

int  dbus_bus_request_name  (DBusConnection   *connection,
                              const char         *name,
                              unsigned int        flags,
                              DBusError        *error)                                   /*  注册连接名称      */

void  dbus_connection_close  (DBusConnection  *connection)                           /*  关闭连接          */

2.3 信号发送与接收

2.3.1 信号发送
     DBUS中信号是一种广播的消息,当发出一个信号,所有连接到 DBUS 总线上并注册了接受对应信号的进程,都会收到该信号。

进程发出一个信号前,需要创建一个 DBusMessage 对象来代表信号,然后追加上一些需要发出的参数,就可以发向总线了。发完之后需要释放消息对象。信号发送的函数声明如程序清单 2‑2所示。

程序清单2-2  信号发送接口

DBusMessage  *dbus_message_new_signal  (const  char  *path,
                                        const  char  *iface,
                                        const  char  *name)                       /*  创建信号类型消息      */
 

void  dbus_message_iter_init_append  ( DBusMessage     *message,
                            DBusMessageIter  *iter)                /*  加入参数到信号        */
 

dbus_bool_t  dbus_connection_send  ( DBusConnection  *connection,
                                      DBusMessage    *message,
                                      dbus_uint32_t    *serial)                       /*  发送信号到总线        */
 

void  dbus_message_unref  (DBusMessage *message)                                 /*  释放消息              */

2.3.2 信号接收
     进程接收信号时,需先告知总线进程感兴趣的消息,然后等待接收消息。信号接收函数声明如程序清单 2‑3所示。

程序清单 2-3 信号接收接口

void  dbus_bus_add_match  ( DBusConnection  *connection,
                             const char        *rule,
                             DBusError       *error)                                 /*  告知总线感兴趣的消息   */
 

DBusMessage  *dbus_connection_pop_message  ( DBusConnection  *connection)         /*  接收消息               */
 

dbus_bool_t  dbus_message_is_signal  (DBusMessage  *message,
                                       const char      *iface,
                                       const char     *signal_name)                      /*  判断消息是否为信号     */

2.4 函数调用和提供函数调用

2.4.1 函数调用
      调用一个远程函数与发送一个信号原理类似,需要先创建一个消息(DBusMessage),然后通过注册在 DBUS上的名称指定发送的对象。然后追加相应的参数,调用方法分为两种,一种是阻塞式的,另一种为异步调用。异步调用的时候会得到一个“DBusMessage *” 类型的返回消息,从这个返回消息中可以获取一些返回的参数。

函数调用的函数声明如程序清单 2‑4所示。

程序清单 2-4 函数调用接口

DBusMessage  *dbus_message_new_method_call  (const char  *destination,
                                              const char  *path,
                                              const char  *iface,
                                              const char  *method)                    /*  创建一个函数调用消息    */

void  dbus_message_iter_init_append  (DBusMessage     *message,
                           DBusMessageIter  *iter)                     /*  为消息添加参数           */
 

dbus_bool_t  dbus_connection_send_with_reply  (DBusConnection   *connection,
                                                DBusMessage      *message,
                                                DBusPendingCall  **pending_return,
                                                int            timeout_milliseconds)       /*  发送消息                */
 

void  dbus_pending_call_block  (DBusPendingCall  *pending)                           /*  阻塞等待返回值           */
 

DBusMessage  *dbus_pending_call_steal_reply  (DBusPendingCall  *pending)             /*  获得返回消息            */
  

dbus_bool_t  dbus_message_iter_init  (DBusMessage     *message,
                           DBusMessageIter  *iter)                     /*  获取参数                */

2.4.2 接收函数调用
     提供远程函数调用,首先需告知总线进程感兴趣的消息,其次从总线获取消息并判定消息是方法调用。然后从消息中获取参数进行函数执行,最后创建返回消息,并发送消息至总线,由总线转发至调用的进程。函数声明如程序清单 2‑5所示。

程序清单 2-5 接收函数调用接口

void  dbus_bus_add_match  ( DBusConnection  *connection,
                             const char        *rule,
                             DBusError       *error)                                   /*  请求获取调用消息       */
 

DBusMessage  *dbus_connection_pop_message  ( DBusConnection  *connection)           /*  从总线获取消息         */
 

dbus_bool_t  dbus_message_is_method_call (DBusMessage  *message,
                                           const char     *iface,
                                           const char     *method)                       /*  判定消息是方法调用     */
  

dbus_bool_t  dbus_message_iter_init  (DBusMessage     *message,
                           DBusMessageIter  *iter)                    /*  获取参数               */
 

DBusMessage  *dbus_message_new_method_return  (DBusMessage *method_call)            /*  创建返回消息           */
 

void  dbus_message_iter_init_append  ( DBusMessage     *message,
                            DBusMessageIter  *iter)                   /*  在消息中填入参数       */
 

dbus_bool_t  dbus_connection_send  ( DBusConnection   *connection,
                                      DBusMessage     *message,
                                      dbus_uint32_t     *serial)                        /*  发送返回消息          */


参考资料:

http://blog.csdn.net/eastmoon502136/article/details/10044993

https://blog.csdn.net/mr_wangning/article/details/60324291

https://www.cnblogs.com/liyiwen/archive/2012/12/02/2798876.html

D-Bus的更多相关文章

  1. 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)

    关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...

  2. Matlab中使用脚本和xml文件自动生成bus模块

    帮一个老师写的小工具 在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫 所以用xml配置文件来写,也便于更 ...

  3. bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...

  4. linux下bus、devices和platform的基础模型

    转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核 ...

  5. ACE bus

    ACE bus增加的内容: 1):5状态的cache model 2):关于coherency的additional signal 3):两个cache master访问shared cache的ad ...

  6. 利用Service bus中的queue中转消息

    有需求就有对策就有市场. 由于公司global的policy,导致对公司外发邮件的service必须要绑定到固定的ip地址,所以别的程序需要调用发邮件程序时,问题就来了,如何在azure上跨servi ...

  7. c程序中出现segment error 和 bus error 的原因

    在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...

  8. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. Windows Azure Service Bus Topics实现系统松散耦合

    前言 Windows Azure中的服务总线(Service Bus)提供了多种功能, 包括队列(Queue), 主题(Topic),中继(Relay),和通知中心(Notification Hub) ...

  10. Windows Azure Service Bus Notification Hub推送通知

    前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...

随机推荐

  1. Microsoft.Office.Interop.Excel 读取 excel 中的 checkbox 和 radio

    using Excel = Microsoft.Office.Interop.Excel; Excel.Application excelapp = new Excel.Application(); ...

  2. C 储存类与运算符

    储存类 参考链接:https://www.runoob.com/cprogramming/c-storage-classes.html 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期 au ...

  3. linux系统下安装配置Jenkins

    准备java 环境 安装java sdk yum -y install java 验证是否安装成功 java -version 下载安装jenkins 官网:https://wiki.jenkins- ...

  4. Django 使用 mysql 数据库连接

    启用 mysql 数据库连接 修改 app01 下的 __init__.py import pymysql pymysql.install_as_MySQLdb() 修改 settings.py DA ...

  5. 基于JieBaNet+Lucene.Net实现全文搜索

    实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...

  6. 对Quene中的队列的状态进行操作

    查看队列的状态(包括队列的满状态.空.元素个数等等) import multiprocessing quene = multiprocessing.Queue(3) quene.put(12) que ...

  7. 笔记5:Django知识一

    Django 1 MVC MVC的核心思想就是解耦. 2 Django介绍 2.1 MVT Django遵循MVC思想,其称为MVT.其中: M: Model模型:和MVC中的M相同和数据库交互 V: ...

  8. Rust中的结构体及方法语法

    这个可以和类作比较,或是go当中的方法比较. #[derive(Debug)] struct Rectangle { width: u32, height: u32, } impl Rectangle ...

  9. 使用ruamel.yaml库,解析yaml文件

    在实现的需求如下: 同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中. 网上看文档,这可以通过扩充pod中的hos ...

  10. 201871010135 张玉晶《面向对象程序设计(java)》第十五周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/12000 ...