linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)
linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)
linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)
linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)
linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)
linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)
linux 进程间通信 dbus-glib【实例】详解四(下) C库 dbus-glib 使用(附代码)
文章目录
- dbus实例讲解(一):初次见面
- 1、dbus是什么东西?
- 2、D-Bus的基本概念
- 2.1、从例子开始
- 2.2、名词
- 2.2.1、Bus Name
- 2.2.1.1、可能有多个备选连接的公共名
- 2.2.1.2、每个连接都有一个唯一名
- 2.2.2、Object Paths
- 2.2.3、Interfaces
- 2.2.4、Methods和Signals
- 2.3 小结
- 3 下集预告
dbus实例讲解(一):初次见面
网上有不少介绍dbus的文章。本文的目标是补充一些简单的例子。
1、dbus是什么东西?
网上有一篇叫“D-Bus Tutorial”的文章,流传较广。不少介绍dbus的资料,都引用了其中的段落。 其实相对于这篇文章,我建议大家直接读“D-Bus Specification”,篇幅不算长, 文字也不算枯燥。
D-Bus是针对桌面环境优化的IPC(interprocess communication )机制,用于进程间的通信或进程与内核的通信。最基本的D-Bus协议是一对一的通信协议。 但在很多情况下,通信的一方是消息总线(dbus daemon?)。消息总线是一个特殊的应用,它同时与多个应用通信,并在应用之间传递消息。下面我们会在实例中观察消息总线的作用。 消息总线的角色有点类似与X系统中的窗口管理器,窗口管理器既是X客户,又负责管理窗口。
支持dbus的系统都有两个标准的消息总线:系统总线和会话总线。系统总线用于系统与应用的通信。会话总线用于应用之间的通信。 网上有一个叫d-feet的python程序,我们可以用它来观察系统中的dbus世界。
D-Bus是一个程序。它提供了API。但我们一般不会直接使用dbus的接口。dbus-glib是GTK版本的dbus接口封装
。 本文假设读者安装了dbus-glib,我安装的是dbus-glib-0.76。后面还会看到,通过python操纵dbus是多么简单。
2、D-Bus的基本概念
2.1、从例子开始
我写了一个最简单的dbus服务器,它通过dbus提供了一个加法的接口。 大家可以下载这个例子。这是一个autotool工程,大家解包后,执行:
./autogen.sh
./configure
make
然后在src目录运行:
./example-service
这时再运行d-feet,连接session bus,在“Bus Name”窗口会看到一个叫“org.fmddlmyy.Test”连接名。
(d-feet我在ubuntu上用apt update && apt install d-feet
安装)
选择“org.fmddlmyy.Test”,在右侧窗口点击展开“Object Paths”->“/TestObj”->“Interfaces”->“org.fmddlmyy.Test.Basic”->“Methods”,可以看到一个Add方法。双击Add方法,弹出下面这个对话框:
在Parameters窗口输入“1,2”,点击“Execute”按钮,然后在“Output”窗口我们看到了输出结果。我们刚刚创建了一个dbus服务并调用了它。
2.2、名词
我们来解释一下d-feet中出现的名词。
2.2.1、Bus Name
可以把Bus Name理解为连接的名称,一个Bus Name总是代表一个应用和消息总线的连接。 有两种作用不同的Bus Name,一个叫公共名(well-known names),还有一个叫唯一名(Unique Connection Name)。
2.2.1.1、可能有多个备选连接的公共名
公共名提供众所周知的服务。其他应用通过这个名称来使用名称对应的服务。可能有多个连接要求提供同个公共名的服务,即多个应用连接到消息总线,要求提供同个公共名的服务。 消息总线会把这些连接排在链表中,并选择一个连接提供公共名代表的服务。可以说这个提供服务的连接拥有了这个公共名。 如果这个连接退出了,消息总线会从链表中选择下一个连接提供服务。公共名是由一些圆点分隔的多个小写标志符组成的,例如“org.fmddlmyy.Test
”、“org.bluez
”。
2.2.1.2、每个连接都有一个唯一名
当应用连接到消息总线时,消息总线会给每个应用分配一个唯一名。唯一名以“:”开头,“:”后面通常是圆点分隔的两个数字,例如“:1.0”。 每个连接都有一个唯一名。在一个消息总线的生命期内,不会有两个连接有相同的唯一名
。 拥有公众名的连接同样有唯一名,例如在前面的图中,“org.fmddlmyy.Test”的唯一名是“:1.17”。
有的连接只有唯一名,没有公众名。可以把这些名称称为私有连接
,因为它们没有提供可以通过公共名访问的服务。 d-feet界面上有个“Hide Private”按钮,可以用来隐藏私有连接。
2.2.2、Object Paths
Bus Name确定了一个应用到消息总线的连接
。在一个应用中可以有多个提供服务的对象。这些对象按照树状结构组织起来。 每个对象都有一个唯一的路径(Object Paths)。或者说,在一个应用中,一个对象路径标志着一个唯一的对象。
“org.fmddlmyy.Test”只有一个叫作“/TestObj”的对象。图1中的“org.bluez”有多个对象路径。
2.2.3、Interfaces
通过对象路径,我们找到应用中的一个对象。每个对象可以实现多个接口。例如:“org.fmddlmyy.Test”的“/TestObj”实现了以下接口:
org.fmddlmyy.Test.Basic
org.freedesktop.DBus.Introspectable
org.freedesktop.DBus.Properties
后面讲代码时会看到,我们在代码中其实只实现了“org.fmddlmyy.Test.Basic”这个接口。 接口“org.freedesktop.DBus.Introspectable”和“org.freedesktop.DBus.Properties”是消息总线提供的标准接口
。
2.2.4、Methods和Signals
接口包括方法和信号。例如“org.fmddlmyy.Test”的“/TestObj”对象的“org.fmddlmyy.Test.Basic”接口有一个Add方法。 后面的例子中我们会介绍信号。
标准接口“org.freedesktop.DBus.Introspectable”的Introspect方法是个很有用的方法。 类似于Java的反射接口,调用Introspect方法可以返回接口的xml描述。我们双击 “org.fmddlmyy.Test”->“/TestObj”->“Interfaces”->“org.freedesktop.DBus.Introspectable”
的Introspect方法。 这个方法没有输入参数,我们直接点击“Execute”按钮,你在“Output”窗口看到了什么?
(我的点了pretty print还是杂乱格式
linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)相关推荐
- 相位 unwrap 与 wrap 算法详解(附代码)
相位 unwrap 与 wrap 算法详解(附代码) 最近接手了一个项目,光通信方面的,我负责编写初测结果的数据处理算法,其中有一个算法叫做 unwrap 与 wrap,之前没有听说过.通过询问同事与 ...
- 二分查找算法详解(附代码)
二分查找算法详解(附代码) 注: 现有一个升序 不重复的数组 查询target是否在此数组中并返回序号 使用条件 使用二分算法的两个条件: 有序 不重复 混淆处 二分算法两种方式容易弄混淆的地方:就是 ...
- python爬虫代码实例源码_python爬虫及案例详解(附代码)
安装三大库 1.requests 2.BeautifulSoup 3.lxml 有的网站做了相应的反爬虫,不能用普通方法爬取网站数据. 这里我用python爬取了几个网站的数据,分别存入csv文件,m ...
- vue 生命周期详解 (附代码)
一. vue的生命周期是什么 vue每个组件都是独立的,都有自己的生命周期,从一个组件创建.数据初始化.挂载.更新.销毁,就是一个组件的生命周期. 一个组件首次加载时,也就只执行 创建.数据初始化到挂 ...
- css动画定义,css3的动画(animation)属性的详解(附代码)
本篇文章给大家带来的内容是关于css3的动画(animation)属性的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. css3动画(animation)具有以下属性: ...
- 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...
- 如何用php新增税金一列_PHP计算个人所得税步骤详解(附代码)
这次给大家带来PHP计算个人所得税步骤详解(附代码),PHP计算个人所得税的注意事项有哪些,下面就是实战案例,一起来看一下. 不使用速算扣除数计算个人所得税,PHP自定义函数实现个人所得税计算.使用速 ...
- ajax 页面无刷新,Ajax的页面无刷新实现详解(附代码)
这次给大家带来Ajax的页面无刷新实现详解(附代码),Ajax页面无刷新实现的注意事项有哪些,下面就是实战案例,一起来看一下. ajax (ajax开发) AJAX即"Asynchronou ...
- 不愧是京东大牛!用Java实现黄金分割数的示例详解(附代码)
这篇文章主要介绍了java 实现黄金分割数的示例详解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧. 黄金分割数 0.618 与美学有重要的关系.舞台上报幕员所站的位置大约就是舞台宽 ...
- BraTS数据集处理详解(附代码详解)
代码参考:https://github.com/sinclairjang/3D-MRI-brain-tumor-segmentation-using-autoencoder-regularizatio ...
最新文章
- 【Android UI设计与开发】第11期:顶部标题栏(二)ActionBar实现Tab选项卡和下拉导航列表
- UOJ #268 BZOJ 4732 [清华集训2016]数据交互 (树链剖分、线段树)
- javascript 正则表达式提取数字使用
- Moravec角点检测算子
- null和undefined相等
- 电脑桌面归纳小窗口_电脑一分钟小技巧:如何将电脑设置为定时关机?
- springboot 多线程_机密文档!阿里产出SpringBoot/Cloud,细节爆炸
- Android课程---Android Studio使用小技巧:提取方法代码片段
- 【Docker】拉取Oracle 11g镜像配置
- etl工具-Taskctl-Web版 批量作业调度监控视图
- 巨蟒python全栈开发-第5天 字典集合
- 联合密度函数求期望_已知概率密度函数怎么求它的数学期望和方差
- 876. 链表的中间结点【我亦无他唯手熟尔】
- android获取手机资源文件,android MediaStore 读取手机文件
- Openharmony应用NAPI详解--进阶篇2
- DataView RowFilter
- 使用Markdown制作简历
- 关于什么时候用精灵图什么时候用字体图标
- 刷脸已经逐步在多个领域落地开花
- win10无法打开服务器文件类型,win10系统无法打开此类型的文件(.exe)的解决方法...