[原文

1. 概述

1.1  DBUS概述
    DBUS是一种高级的进程间通信机制。DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信息转发到目的进程。DBUS后台进程充当着一个路由器的角色。
    DBUS中主要概念为总线,连接到总线的进程可通过总线接收或传递消息,总线收到消息时,根据不同的消息类型进行不同的处理。DBUS中消息分为四类:
    1.  Methodcall消息:将触发一个函数调用 ;
    2.  Methodreturn消息:触发函数调用返回的结果;
    3.  Error消息:触发的函数调用返回一个异常 ;
    4.  Signal消息:通知,可以看作为事件消息。
1.2  DBUS应用场景
    根据DBUS消息类型可知,DBUS提供一种高效的进程间通信机制,主要用于进程间函数调用以及进程间信号广播。
1 . 函数调用
    DBUS可以实现进程间函数调用,进程A发送函数调用的请求(Methodcall消息),经过总线转发至进程B。进程B将应答函数返回值(Method return消息)或者错误消息(Error消息)。
2 . 消息广播
    进程间消息广播(Signal消息)不需要响应,接收方需要向总线注册感兴趣的消息类型,当总线接收到“Signal消息”类型的消息时,会将消息转发至希望接收的进程。
1.3  DBUS通信特点
    DBUS是一种低延迟、低开销、高可用性的进程间通信机制。其协议是二进制的,避免序列化的过程,通信效率较高。DUBUS可以提供一些更高层的功能:
    1.  结构化的名字空间;
    2.  独立于架构的数据格式;
    3.  支持消息中的大部分通用数据元素;
    4.  带有异常处理的通用远程调用接口;
    5.  支持广播类型的通信。
2. 技术实现
2.1 实现原理
    DBUS是一种高级的IPC通信机制,通信流程如图 2‑1所示。在DBUS通信过程中,存在一个后台进程(BUS Daemon Process)。后台进程和普通进程间信息交互是通过域套接字进行通信。
图 2-1 DBUS通信原理
     如图 2‑1所示,进程1(Process1)需先连接到总线(dbus_bus_get),其次构造消息(dbus_message_new_signal),然后发送消息(dbus_connection_send)到后台进程。后台进程接收消息,然后根据消息类型对消息进行不同处理(bus_dispatch_matches)。
     进程2(Process2)接收消息前需要连接到总线,并告知总线自己希望得到的消息类型(dbus_bus_add_match),然后等待接收消息(dbus_connection_pop_message)。进程2(Process2)收到总线转发的消息时会根据消息类型,做不同的处理(若是信号类型则不需要发送返回值给总线)。
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)                        /*  发送返回消息          */
3. 小结
    DBUS是一种高效、易用的进程间通信方式。本文档介绍了DBUS的通信原理,以信号收发和方法调用为框架,介绍了DBUS中常用的函数接口。
4. 参考资料
     网上看到两篇写的很不错的博客,可以参考学习。
      1. http://blog.csdn.net/eastmoon502136/article/details/10044993
      2.http://www.cnblogs.com/liyiwen/archive/2012/12/02/2798876.html
--------------------- 
作者:灞波儿渀 
来源:CSDN 
原文:https://blog.csdn.net/mr_wangning/article/details/60324291 
版权声明:本文为博主原创文章,转载请附上博文链接!

DBUS及常用接口介绍的更多相关文章

  1. dbus通信与接口介绍

    DBUS是一种高级的进程间通信机制.DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信 ...

  2. C#中常用接口介绍

    1. IComparable接口 IComparable接口定义通用的比较方法.由类型使用的IComparable接口提供了一种比较多个对象的标准方式.如果一个类要实现与其它对象的比较, 则必须实现I ...

  3. Java ArrayList常用接口介绍及示例

    Java List 常用类型 类型 特征 ArrayList 随机访问元素快:中间插入与删除元素较慢:操作不是线程安全的 LinkedList 中间插入与删除操作代价较低,提供优化的顺序访问:随机访问 ...

  4. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

  5. go语言之进阶篇文件常用操作接口介绍和使用

    一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...

  6. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  7. JDBC常用接口、类介绍

    JDBC常用接口.类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令.API常用的类.接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connectio ...

  8. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  9. Linux下查看某个进程打开的文件数-losf工具常用参数介绍

    Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...

随机推荐

  1. Windows 下配置 php_imagick 扩展

    1.首先按装 imageimagick 可以去 http://imagemagick.org/script/binary-releases.php#windows 这里下载,看好自己的系统环境和选择好 ...

  2. 三.插入和查找MySQL记录 数据类型

    1.插入数据的两种方式 1)INSERT tb1 VALUES('TOM',25,1863.25); 2)INSERT tb1(username,salary) VALUES('John',4500. ...

  3. windows中根据进程PID查找进程对象过程深入分析

    这里windows和Linxu系列的PID 管理方式有所不同,windows中进程的PID和句柄没有本质区别,根据句柄索引对象和根据PID或者TID查找进程或者线程的步骤也是一样的.   句柄是针对进 ...

  4. 爬虫之Xpath详解

    XPath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 ...

  5. NSUserDefaults保存对象数组报错

    在使用NSUserDefaults的时候插入数据有时候会报以下错误:Attempt to set a non-property-list objec 这种错误的原因是插入了不识别的数据类型,NSUse ...

  6. SharePoint 2013 附加内容数据库后出现404错误

    本文讲述怎样解决SharePoint 2013 加内容数据库(Content DataBase)后出现404错误. 笔者依照http://technet.microsoft.com/en-us/lib ...

  7. 简单的SQL注入学习

    引贴: http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面,讲php页面放入/opt ...

  8. media query媒体查询

    媒体查询(CSS3 media query) 一.逻辑操作符:not.and.only not:not操作符用来对一条媒体查询的结果取反. and:and操作符用来把多个媒体属性组合起来,合并到同一条 ...

  9. docker——数据管理

    生产环境中使用docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享.容器中管理数据主要有两种方式: 数据卷(Date Volumes):容器内数据直接映射到本地环境 数据 ...

  10. python字符串搜索

    python字符串字串查找 find和index方法 更多0 python 字符串 python 字符串查找有4个方法,1 find,2 index方法,3 rfind方法,4 rindex方法. 1 ...