DBus编程学习

  最近公司的项目,基于linux平台的,需要用到进程间通讯的相关东东。由于早先的时候已经用过socket而且有完整的代码,最初的策略是打算使用socket实现的。但是,公司的一个大神提出使用DBus,所以最近学习了一些相关的知识。周五的时候,又发现可能又会改回去使用socket了,╮(╯▽╰)╭。这边还是整理一下,防止以后要用吧。另外再说一句,DBus确实是一个好东西。如果有错漏之处,请指正~~


DBus的简介

  DBus是一种高级的进程间通讯工具,最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。DBus在本质上也是使用的socket机制,只不过对其进行了封装。它主要由以下三层结构构成:

  • libdus库,通过该库文件可以使两个进程方便的进行信息交互
  • 一个可执行的消息总线守护进程(message bus daemon)。可以在ubuntu或者android系统中找到一个dbus-deamon进程,该进程通常是在开机时启动。需要进行消息交互的进程,通常是首先连接到该守护进程上,然后才进行交互的。该守护进程主要起到了一个路由的功能,从而使得某个进程(server)可以将消息发送给任意多个的其他进程(client)
  • 一些封装库(wrapper libraries),通过封装库程序员可以很方便的进行程序的实现。dbus为我们提供了许多封装库,包括QT3、QT4、JAVA、Perl、 C++、 Pascal、.NET、Ruby等等

  单独使用libdus库,只能类似于socket那样进行一对一的通讯。但是,dbus发送的是一个称为message的东东,而不是单纯的字节流。每个message都包含了header和body,body主要包含了信息,header可以用于标示message的类型和权限等等东东。

  刚刚说到的守护进程,通常情况下系统会拥有一个,然后每个登陆用户各自有一个。这样各个用户就可以各干各的,不互相干扰了。在android下只有一个单独的守护进程,估计是由于android下就一个用户,所以谷歌进行了修改吧。下面的这个图是我从DBus的官网那边A过来的,大家可以看看。

DBus的基础概念

网上找到一个文章,这些概念都介绍的十分详细,又不是写论文,因此我就直接贴过来了,文章具体地址:DBUS基础知识。文章很不错,只是例子使用的是比较老的libdus-glib库,较新的应该是GDBus库。

总线是D-Bus的进程间通信机制,一个系统中通常存在多条总线,这些总线由D-Bus总线守护进程管理。


系统总线(System Bus):该总线是最重要的总线,Linux内核引导时,该总线就已被装入内存。只有Linux内核、Linux桌面环境和权限较高的程序才能向该总线写入消息,以此保障系统安全性,防止有恶意进程假冒Linux发送消息。


会话总线(Session Buses)由普通进程创建,可同时存在多条。会话总线属于某个进程私有,它用于进程间传递消息。
进程必须注册后才能收到总线中的消息,并且可同时连接到多条总线中。D-Bus提供了匹配器(Matchers)使进程可以有选择性的接收消息,另外运行进程注册回调函数,在收到指定消息时进行处理。匹配器的功能等同与路由,用于避免处理无关消息造成进程的性能下降。除此以外,D-Bus机制的重要概念有以下几个。


对象:对象是封装后的匹配器与回调函数,它以对等(peer-to-peer)协议使每个消息都有一个源地址和一个目的地址。这些地址又称为对象路径,或者称之为总线名称。对象的接口是回调函数,它以类似C++的虚拟函数实现。当一个进程注册到某个总线时,都要创建相应的消息对象。


消息:D-Bus的消息分为信号(signals)、方法调用(method calls)、方法返回(method returns)和错误(errors)。信号是最基本的消息,注册的进程可简单地发送信号到总线上,其他进程通过总线读取消息。方法调用是通过总线传递参数,执行另一个进程接口函数的机制,用于某个进程控制另一个进程。方法返回是注册的进程在收到相关信息后,自动做出反应的机制,由回调函数实现。错误是信号的一种,是注册进程错误处理机制之一。


服务:服务(Services)是进程注册的抽象。进程注册某个地址后,即可获得对应总线的服务。D-Bus提供了服务查询接口,进程可通过该接口查询某个服务是否存在。或者在服务结束时自动收到来自系统的消息。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值