ubuntu dbus 学习

ubuntu dbus 学习

ubuntu glib dbus

https://dbus.freedesktop.org/doc/dbus-specification.html

  1. 命令行输入:

    sudo apt-get install dbus

DBus作为一个轻量级的IPC被越来越多的平台接受,用于进程间通信或进程与内核的通信。
DBus进程间通信主要有三层架构:
1.底层接口层:主要是通过libdbus这个函数库,给予系统使用DBus的能力。
2.总线层:主 要Message bus daemon这个总线守护进程提供的,在Linux系统启动时运行,负责进程间的消息路由和传递,其中包括Linux内核和Linux桌面环境的消息传 递。总线守护进程可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。
3.应用封装层:通过一系列基于特定应用程序框架将DBus的底层接口封装成友好的Wrapper库,供不同开发人员使用。比如libdbus-glib, libdbus-python.

如上图所示,Bus Daemon Process是运行在linux系统中的一个后台守护进程,dbus-daemon运行时会调用libdus的库。Application Process1代表的就是应用程序进程,通过调用特定的应用程序框架的Wrapper库与dbus-daemon进行通信。
从上图也可以看出来Application和Daemon中其实还是通过socket进行通行。

DBus的三大优点:低延迟,低开销,高可用性。

*低延迟:DBus一开始就是用来设计成避免来回传递和允许异步操作的。因此虽然在Application和Daemon之间是通过socket实现的,但是又去掉了socket的循环等待,保证了操作的实时高效。

*低开销:DBus使用一个二进制的协议,不需要转化成像XML这样的文本格式。因为DBus是主要用来机器内部的IPC,而不是为了网络上的IPC机制而准备的.所以它才能够在本机内部达到最优效果。

*高可用性:DBus是基于消息机制而不是字节流机制。它能自动管理一大堆困难的IPC问题。同样的,DBus库被设计来让程序员能够使用他们已经写好的代码。而不会让他们放弃已经写好的代码,被迫通过学习新的IPC机制来根据新的IPC特性重写这些代码。

在介绍基本概念之前,先介绍一个学习DBus的好工具d-feet,这个工具主要是用来查看DBus的System Bus和Session Bus中的各个消息连接的。当然,你也可以在这里面添加自己创建的消息总线,以便于观察。

下面根据上图介绍一下DBus中的一些基本概念。

会话总线(Session Buses)普通进程创建,可同时存在多条。会话总线属于某个进程私有,它用于进程间传递消息。

系统总线(System Bus)在引导时就会启动,它由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。当然,如果一个应用程序需要接受来自系统总线的消息,他也可以直接连接到系统总线中,但是他能发送的消息是受限的。

Bus Name按字面理解为总线名称貌似不是很贴切,应该是一个连接名称,主要是用来标识一个应用和消息总线的连接。从上图可以看出来,总线名称主要分为两类

"org.kde.StatusNotifierWatcher"这种形式的称为公共名(well-knownname)

":1.3"这种形式的称为唯一名(Unique Name)

公共名提供众所周知的服务。其他应用通过这个名称来使用名称对应的服务。可能有多个连接要求提供同个公共名的服 务,即多个应用连接到消息总线,要求提供同个公共名的服务。消息总线会把这些连接排在链表中,并选择一个连接提供公共名代表的服务。可以说这个提供服务的 连接拥有了这个公共名。如果这个连接退出了,消息总线会从链表中选择下一个连接提供服务。

D-bus是一个进程间通信的工具,优点不在这里赘述。

网上很多关于dbus的帖子都是基于dbus-glib或者QT D-bus的,直接使用dbus的教程比较少。也难怪,因为连D-bus的官网都说:“If you use this low-level API directly, you’re signing up for some pain.”

但实际上,直接使用D-bus也没有想象中难。本文将对直接使用D-bus做一个介绍。

本文参考了其他一些网站的帖子或者介绍

官网:http://www.freedesktop.org/wiki/Software/dbus/

经典例子:http://www.matthew.ath.cx/articles/dbus

不错的帖子:http://blog.csdn.net/flowingflying/article/details/4527634

一、概念介绍

这里虽然说是概念介绍,其实只是我个人对D-bus的一个理解,不一定完整准确。

1.首先,D-bus可以分成三部分来看,

(1)dbus-daemon,一个dbus的后台守护程序,用于多个应用之间消息的转发;

(2)libdbus.so,dbus的功能接口,当你的程序需要使用dbus时,其实就是调用libdbus.so里面的接口;

(3)高层封装,如dbus-glib和QT D-bus,这些其实都对D-bus的再封装,让你使用起来更方便。

从D-bus官网下载到源码,其实只包含上面所说的1和2两部分,libdbus.so里面的接口也就是官网说的low-level API。

2.关于address、bus name、path。。。。

D-bus里面提到了一些概念,刚开始不太好理解,这些概念也很容易混淆。这些概念的权威解释可以看这里。

首先,运行一个dbus-daemon就是创建了一条通信的总线Bus。当一个application连接到这条Bus上面时,就产生了Connection。

每个application里面会有不同的Object。这里Object的概念,可以简单地理解为C++里面一个类的实例。从D-bus的概念上说,通信双方是Object,不是application,一个application是可以包含很多个Object的。

而一个Object里面又会有不同的Interface,这个Interface我把它理解为Object里面的一个类的成员。这些Interface其实是通信方式的集合。

这里又牵扯出来一个通信方式,D-bus里面支持的通信方式有两种,一种叫signal,一种叫method。signal简单地讲,其实就是广播,就是一对多的通信方式,可以从app1向其他所有的app发消息,但其他的app是不会对signal进行回复的。method则是一对一的通信,一问一答。这种方式有点像远程调用,app1调用app2的method并传递参数给这个method,获取到这个method返回的结果。

上面把D-bus通信里面的几个重要元素都介绍了一下,大概的关系是这样的:
————————————————
版权声明:本文为CSDN博主「ty3219」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ty3219/article/details/47358329

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值