DBUS及常用接口介绍

2023-11-10

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Blender51个基本操作

    一 选择操作 编辑模式 1 右键 选择 2 A 全选 3 B 左键 矩形选择 4 B 中键点击 矩形移除选择 5 C 左键 圆形选择 6 C 中键点击 圆形移除选择 7 滚轮滑动 圆形选择框大小 8 Ctrl 左键 扇形选择 9 Ctrl
  • IDEA去除掉虚线,波浪线,和下划线实线的方法

    推荐一下个人的公众号 终码一生 专注于Java技术学习 开源项目分享和常见问题解决等 喜欢的小伙伴可以关注下 感谢大家的支持 初次安装使用IDEA 总是能看到导入代码后 出现很多的波浪线 下划线和虚线 这是IDEA给我们的一些提示和警告 但
  • C# Socket连接请求超时处理

    在Socket的超时时间默认20多秒 而实际连上不需1秒时间 20多秒很多时候用户是不能接受的 而在等待返回结果的这段时间里程序会处于停止响应状态 废话不多说了 先上代码 private delegate string ConnectSoc
  • 碎碎念之工作②

  • 【Android Studio】Design editor is unavailable until next gradle sync.如何解决?

    Design editor is unavailable until next gradle sync 如何解决 打开一个网上开源的下载文件 在查看安卓页面布局 也就是控件布局时 会出现一个bug Design editor is unav
  • 杂七杂八的小知识

    杂七杂八的小知识 前端知识 Node js安装注意事项 Vue学习文档 Mysql数据库小知识 安装数据库后使用数据库所需步骤 MySQL远程连接 常用数据库命令 mysql数据库导入查询 StarUML使用教程 docker小知识 cma
  • 通过python程序调取摄像头画面

    目录 1 方法 2 演示代码 3 总结 1 方法 想要调取摄像头画面有这么几个前提 需要使用网络摄像头并且支持RTSP协议 摄像头要和你的电脑在同一个局域网下 需要知道摄像头的账号 密码 IP地址 RTSP协议是一种网络传输协议 不同的摄像
  • Freertos 在contexM0芯片上的移植

    1 freertos源码 官网下载地址 https www freertos org 下载LTS长期支持版本 2 在工程目录下新建FreeRTOS文件夹 将FreeRTOS 的源码添加到这个文件夹中 portable 文件夹中只需要复制 k
  • 如何使用 python 持续监控节奏盒的音轨变化

    我想使用 python 监控 Rhythmbox 中曲目的变化 我想不断检查轨道的变化 并在轨道发生变化时执行一组函数 我编写了一段代码 它从 dbus 获取 Rhythmbox 接口并获取当前曲目详细信息 但必须手动运行该程序来检查是否有
  • B2B公司如何寻找意向客户的联系方式?

    在B2B公司的营销过程中 少不了寻找意向客户的阶段 这也是销售过程中非常重要的一步 很多新人都是拿到客户联系方式 就直接打电话拜访 俗话说不打没有准备的仗 因此在拜访客户之前就应该做好功课 充分了解客户 这也是B2B业务场景下必做的一环 通
  • 走进暄桐教室 一起观看暄桐同学作品及感受

    暄桐是一间传统美学教育教室 创办于2011年 林曦是创办人和授课老师 教授以书法为主的传统文化和技艺 旨在以书法为起点 亲近中国传统之美 以实践和所得 滋养当下生活 其实 暄桐教室的写字画画课 不仅是林曦老师单方面的输出 而是有分享 也有回
  • 最具挑战的骑行路线

    1 318川藏线 2 独库公路 561公里 3 珠峰尼泊尔 1000公里 4 沙漠公路 1800公里 5 219新藏线 2500公里 下面是一些别人的骑行记录 证书或奖牌 参考 1 抖音 Max骑行玩家 https v douyin com
  • easyrecovery软件2025免费版电脑数据恢复软件

    easyrecovery14是easyrecovery系列软件的新版本 也是目前行业领先的数据恢复软件 具备更快捷 更高效 更便捷三大特色 能够帮助用户轻松恢复电脑丢失的数据 目前软件支持恢复不同存储介质数据 包括硬盘 光盘 U盘 移动硬盘
  • FAM amine, 6-isomer,1313393-44-0,含有纯6-异构体的荧光团,6-FAM NH2

    产品名称 FAM amine 6 isomer 6 FAM NH2 中文名称 6 羧基荧光素 氨基 CAS 1313393 44 0 分子式 C27H26N2O6 分子量 474 51 纯度 95 结构式 产品描述 荧光素衍生物具有胺基 含
  • 从 shell dbus-send 在 C 中调用 dbus

    我有一个 dbus send 调用 dbus send system print reply dest org freedesktop ModemManager1 org freedesktop ModemManager1 Modem 0
  • DBus.Error.AccessDenied:被拒绝。基于 TCP 的 DBUS

    With the help of the following Stackoverflow answers here https stackoverflow com a 13275973 1277793 and here https stac
  • 如何使用 dbus-send 调用 org.bluez.Adapter1.StartDiscovery?

    我正在尝试使用 Bluez 5 44 进行交互dbus send https dbus freedesktop org doc dbus send 1 html命令行工具 我似乎无法让它正确启动发现 尽管当我使用时它工作得很好bluetoo
  • 在 python 中使用 org.mpris.mediaplayer2.player PlaybackStatus 属性

    The 规格页 http specifications freedesktop org mpris spec latest Player Interface html summary对于这个特定的接口说 PlaybackStatus s P
  • DBus 是我要找的吗?

    我需要一个Linux上的IPC系统 我的要求是 面向数据包 消息 能够处理点对点和一对多通信 没有层次结构 没有服务器和客户端 如果一个端点崩溃 必须通知其他端点 现有 Linux 发行版的良好支持 Apache 存在 绑定 用于创建动态页
  • 如何在 dbus-send 中使用变体字典 (`a{sv}`)

    我有一些麻烦dbus send使用时a sv 调用方法in signature a ss 似乎可以使用 以下命令行 dbus send dest org test TestService org test TestService objec

随机推荐

  • 分布式搜索elasticsearch高级配置之(二)------线程池设置

    原文 http blog csdn net laigood article details 7943630 一个Elasticsearch节点会有多个线程池 但重要的是下面四个 索引 index 主要是索引数据和删除数据操作 默认是cach
  • Tensorrt下的Yolox部署

    这里写目录标题 一 Ubuntu系统的安装与显卡驱动安装 二 Tensorrt的安装 三 YOLOX的安装 四 torch2trt的安装 五 engine文件的准备 根据设备修改源文件 引擎生成 六 运行demo 先改一下CMakeList
  • 终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会

    号外号外 死磕 Java 并发编程 系列连载中 大家可以关注一波 死磕 Java 并发编程05 阿里面试失败后 一气之下我图解了Java中18把锁 死磕 Java 并发编程04 说说Java Atomic 原子类的实现原理 死磕 Java
  • Android导出aar时嵌套引用的那些坑

    http www jianshu com p 7a532de0b111 最近写了个Android SDK工程 在代码 测试统统完成后 居然在导出的一步折腾了两三天 在此总结下查找资料的过程和结果 引以借鉴 首先 这次趟坑解决了以下问题 导出
  • 替换word中手动换行(软回车)为段落标记(硬回车)

    在字处理软件中 由Enter键按下去导致一行文字换行的叫硬回车 程序自动换行的叫做软回车 软回车是用 Shift Enter 产生的 它换行 但是并不换段 即前后两段文字在 Word 中属于同一 段 word中遇到网页粘贴过来的内容会有大量
  • Unity背景移动特效

    每日一句 嘴角上扬的时候 任何事物都变得可爱起来了 第一步 确保所要滚动的图像 Wrap Made Repeat 第二步 画布下滚动图像使用 Raw Image组件 可以访问UV 第三步 创建脚本ScrollControl挂载在滚动图像上
  • 增强型pmos电路符号_MOS管:管脚判定与符号画法

    MOS管是我们在电路设计中经常用的一种无源器件 下面介绍下MOS管在原理图 PCB以及实物PCBA上如何辨别其各个管脚 方便调试 管脚判定 1 MOS管GSD在原理图和PCB上怎样判别 G极 gate 栅极 不用说比较好认 封装上左下角为G
  • 【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小

    题目描述 给定包含N个数的无序数组S 可能包含负数 0 正数 求三个数A B C 使其和的绝对值最小 例如 S 9 0 1 3 6 A 9 B 3 C 6 MIN 0 算法解析 解法一 枚举3个数 O N N N 解法二 对S排序后枚举其中
  • Java中如何实现动态代理

    想要实现Java中的动态代理首先应 动态生成接口实现类 interface 接口不能实例化 但是 interface 类型的引用 可以指向任何一个实现类对象实例 但前提是 在编译期必须存在该接口的实现类 如果在编译期无法编写或提供实现类 而
  • 【深度学习】利用tensorflow2.0卷积神经网络进行卫星图片分类实例操作详解

    本文的应用场景是对于卫星图片数据的分类 图片总共1400张 分为airplane和lake两类 也就是一个二分类的问题 所有的图片已经分别放置在2 class文件夹下的两个子文件夹中 下面将从这个实例的详细拆解中 理解tensorflow2
  • spark+项目总结

    做项目基本流程 1 梳理数据流程 2 解决关键性问题 3 串联整个流程过程即标准化以及正式上线 解决关键性问题 对比差异点 数据的文件组织形式不同 数据的格式不同 相同点 数据流程一样 数据目标也是一样 曝光 Exposure 广告领域专业
  • python读写文本老是报错?codecs模块统一编码 一行代码搞定py字符读写

    在python程序中 经常要用到字符文本的读和写 用py自带的 读read 写write 定义字符编码比较麻烦 而用第三方 codecs 模块 在读写字符文本时 可以指定字符编码 就好用很多 下面 我用 codecs 模块 自己编写了一个d
  • 强化学习笔记-13 Policy Gradient Methods

    强化学习算法主要在于学习最优的决策 到目前为止 我们所讨论的决策选择都是通过价值预估函数来间接选择的 本节讨论的是通过一个参数化决策模型来直接根据状态选择动作 而不是根据价值预估函数来间接选择 我们可以定义如下Policy Gradient
  • 2013电商“三国杀”

    2013电商 三国杀 本周 DCCI发布了 Forecast2013 中国电子商务蓝皮书 蓝皮书预测 2013年 淘宝 京东和腾讯将成为电商三甲 纵观中国电商的2012年 高调的京东 霸气的淘宝和默默耕耘的腾讯 似乎正在勾画着未来中国电商行
  • python time.sleep(t) t为秒

    睡眠5秒 import time time sleep 5
  • location.href 与 location.search

    document location href 返回完整的 URL 如 http www cftea com foo asp p 1 引用 location search是从当前URL的 号开始的字符串 如 http www 51js com
  • 《计算机视觉中的多视图几何》笔记(2)

    2 Projective Geometry and Transformations of 2D 本章主要介绍本书必要的几何知识与符号 文章目录 2 Projective Geometry and Transformations of 2D
  • 元素和小于等于阈值的正方形的最大边长

    LeetCode 1292 元素和小于等于阈值的正方形的最大边长 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold 请你返回元素总和小于或等于阈值的正方形区域的最大边长 如果没有这样的正方形区域 则返回 0 示
  • QT 信号发送多个参数

    你可以把多个参数包装为一个类发送 实测是可以的
  • DBUS及常用接口介绍

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