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实例讲解(二下):消息和消息总线
    • 2.3.2、ListActivatableNames和服务器的自动启动
    • 2.3.3、其它方法
      • NameHasOwner判断有没有连接拥有指定的公共名:
      • GetNameOwner返回公共名对应的唯一名:
      • GetConnectionUnixUser返回指定连接对应的服务器进程的Unix用户id:
      • GetId返回消息总线的ID:
  • 3 结束语

dbus实例讲解(二下):消息和消息总线

2.3.2、ListActivatableNames和服务器的自动启动

运行:(普通用户下都能运行,root用户下只能运行system,session运行不了)

$ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames

$ dbus-send --session --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames
返回的数据是一样的。在我的电脑上返回的数据是:

   array [string "org.freedesktop.DBus"string "org.freedesktop.Notifications"string "net.ekiga.helper"string "org.freedesktop.PowerManagement"string "org.freedesktop.Tracker"string "org.freedesktop.SystemToolsBackends.GroupsConfig"string "org.freedesktop.SystemToolsBackends.NTPConfig"string "org.gnome.Tomboy"string "org.freedesktop.SystemToolsBackends.HostsConfig"string "org.freedesktop.SystemToolsBackends.NFSConfig"string "org.freedesktop.SystemToolsBackends"string "net.ekiga.instance"string "org.gnome.GnomeVFS.Daemon"string "com.redhat.dhcp"string "org.freedesktop.SystemToolsBackends.TimeConfig"string "org.freedesktop.SystemToolsBackends.IfacesConfig"string "org.freedesktop.SystemToolsBackends.ServicesConfig"string "org.gnome.Rhythmbox"string "org.freedesktop.SystemToolsBackends.Platform"string "org.freedesktop.SystemToolsBackends.UsersConfig"string "org.freedesktop.SystemToolsBackends.SMBConfig"string "org.gnome.SettingsDaemon"]

我们也可以用python脚本调用ListActivatableNames。例如:写一个叫dls.py的脚本:(我ubuntu没装python就不演示了)

$ cat dls.py
#!/usr/bin/env python
import dbus
bus=dbus.SystemBus()
bus_obj=bus.get_object('org.freedesktop.DBus', '/')
iface=dbus.Interface(bus_obj, 'org.freedesktop.DBus')
names=iface.ListActivatableNames()
for n in names:print n

运行:

$ ./dls.py |sort

输出为:

com.redhat.dhcp
net.ekiga.helper
net.ekiga.instance
org.freedesktop.DBus
org.freedesktop.Notifications
org.freedesktop.PowerManagement
org.freedesktop.SystemToolsBackends
org.freedesktop.SystemToolsBackends.GroupsConfig
org.freedesktop.SystemToolsBackends.HostsConfig
org.freedesktop.SystemToolsBackends.IfacesConfig
org.freedesktop.SystemToolsBackends.NFSConfig
org.freedesktop.SystemToolsBackends.NTPConfig
org.freedesktop.SystemToolsBackends.Platform
org.freedesktop.SystemToolsBackends.ServicesConfig
org.freedesktop.SystemToolsBackends.SMBConfig
org.freedesktop.SystemToolsBackends.TimeConfig
org.freedesktop.SystemToolsBackends.UsersConfig
org.freedesktop.Tracker
org.gnome.GnomeVFS.Daemon
org.gnome.Rhythmbox
org.gnome.SettingsDaemon
org.gnome.Tomboy

使用python脚本调用dbus接口是不是很简单。如果你看过dbus-glib的代码(后面会讲解),你对python的简洁会有更深刻的感触(额,,,这是暗示dbus-glib代码很复杂??)。如果你执行:

$ cat /usr/share/dbus-1/services/*|grep Name|awk -F= '{print $2}'|sort

(ubuntu里service里有东西,arm摄像头service目录下啥也没有)
你会得到:

com.redhat.dhcp
net.ekiga.helper
net.ekiga.instance
org.freedesktop.Notifications
org.freedesktop.PowerManagement
org.freedesktop.SystemToolsBackends
org.freedesktop.SystemToolsBackends.GroupsConfig
org.freedesktop.SystemToolsBackends.HostsConfig
org.freedesktop.SystemToolsBackends.IfacesConfig
org.freedesktop.SystemToolsBackends.NFSConfig
org.freedesktop.SystemToolsBackends.NTPConfig
org.freedesktop.SystemToolsBackends.Platform
org.freedesktop.SystemToolsBackends.ServicesConfig
org.freedesktop.SystemToolsBackends.SMBConfig
org.freedesktop.SystemToolsBackends.TimeConfig
org.freedesktop.SystemToolsBackends.UsersConfig
org.freedesktop.Tracker
org.gnome.GnomeVFS.Daemon
org.gnome.Rhythmbox
org.gnome.SettingsDaemon
org.gnome.Tomboy

这条命令的输出与ListActivatableNames的输出是不是基本相同?你能看懂上面这条命令吗?

(cat /usr/share/dbus-1/services/*|grep Name|awk -F= ‘{print $2}’|sort)

它将"/usr/share/dbus-1/services/"下所有文件交给grep筛选出包含“Name”的行。将包含“Name”的行交给awk处理,awk用"="作为列分隔符,取出第二列然后交给sort排序后输出。

"/usr/share/dbus-1/services/"目录就是dbus放service文件的地方。需要自动启动的服务器会在这个目录放一个service文件,例如:

$ cat /usr/share/dbus-1/services/dhcdbd.service

[D-BUS Service]
Name=com.redhat.dhcp
Exec=/usr/sbin/dhcdbd

Name是服务器的公共名,Exec是服务器的执行路径。在客户请求一个服务,但该服务还没有启动时。dbus会根据service文件自动启动服务。我们再写一个调用“org.fmddlmyy.Test”的Add接口的python脚本:

$ cat add.py
#!/usr/bin/env python
import dbus
bus = dbus.SessionBus()
obj = bus.get_object( 'org.fmddlmyy.Test', '/TestObj' )
iface = dbus.Interface(obj, 'org.fmddlmyy.Test.Basic')
sum = iface.Add(100, 999)
print sum

在启动“org.fmddlmyy.Test”服务器前调用这个脚本

$ ./add.py
会得到错误输出:

...
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.fmddlmyy.Test was not provided by any .service files

我们编辑一个service文件:

$ cat org.fmddlmyy.Test.service
[D-BUS Service]
Name=org.fmddlmyy.Test
Exec=/home/lvjie/work/dbus/hello-dbus3-0.1/src/example-service

把这个文件放到"/usr/share/dbus-1/services/"目录后,再执行add.py:

$ sudo cp org.fmddlmyy.Test.service /usr/share/dbus-1/services/
$ cd …/…/py
$ ./add.py
1099
这次dbus自动启动了服务器,我们的客户脚本得到了正确的输出,你有没有感到dbus的神奇?dbus在自动启动服务器后,不会自动关闭。如果没人管它,这个服务器会一直开着。

2.3.3、其它方法

再演示几个“org.freedesktop.DBus”接口的方法。

NameHasOwner判断有没有连接拥有指定的公共名:

$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.NameHasOwner string:"org.fmddlmyy.Test"
输出为:

method return sender=org.freedesktop.DBus -> dest=:1.31 reply_serial=2boolean true

GetNameOwner返回公共名对应的唯一名:

$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetNameOwner string:"org.fmddlmyy.Test"
输出为:

method return sender=org.freedesktop.DBus -> dest=:1.32 reply_serial=2string ":1.30"

GetConnectionUnixUser返回指定连接对应的服务器进程的Unix用户id:

$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetConnectionUnixUser string:":1.30"
输出为:

method return sender=org.freedesktop.DBus -> dest=:1.33 reply_serial=2uint32 1000

这就是我的用户id:

$ id -u lvjie
1000

GetId返回消息总线的ID:

$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
输出为:

method return sender=org.freedesktop.DBus -> dest=:1.34 reply_serial=2string "dc209fee5f8ce01b0c23da0049668f11"

3 结束语

这一集有一些python代码。即使你没有学过python,我也建议你看一看、试一试。其实我也没有学过python。 小时候,好像听过什么德国人一边看说明书一边开飞机的笑话。这或许是吹牛,但对于程序员来说一边查手册一边用新语言写一些简单程序应该不算困难。 下一讲我们要写一个略大点的python程序。虽然我习惯于C/C++的事必躬亲,但不可否认python确实是很有魅力的语言, 难怪在嵌入式环境也有那么多人用python作原型开发。

参考文章:dbus实例讲解(二下):消息和消息总线

linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)相关推荐

  1. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  2. linux syslogd 源码,syslogd 详解二

    相关博文: syslogd 详解一 syslogd 详解三 1. 前言 上一篇博文中详细了分析了syslogd的架构,解析了syslogd的调用过程,以及syslog.conf 的详细使用方法,这一篇 ...

  3. Linux 内核0.11 系统调用详解(下)

    备注:上讲中,博猪讲到了操作系统是如何让用户程序调用系统函数的,这讲继续接上讲的话题,从一个系统内核系统函数创建的小实验来学习系统内核具体做了些什么.理清下系统调用的整体过程. 实验:在Linux 0 ...

  4. 太酷了!Linux的30 个实例详解 TOP 命令!

    英文:Linoxide 编译:Linux中国/geekpilinux.cn/article-2352-1.html Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被 ...

  5. LINUX操作系统的内核编译内幕详解二

    5. Memory Technology Device(MTD) MTD设备支持.可不选. 6. Parallel port support 串口支持.如果不打算使用串口,就别选了. 7. Plug ...

  6. C#操作GridView控件绑定数据实例详解(二)

    上文实现的GridView控件: (一)翻页功能 翻页内容,主要实现的是该控件下面,上下翻页,跳转到指定页面. 翻页功能要注意前台页面下面这段代码中的相关命令: <PagerTemplate & ...

  7. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  8. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  9. linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

最新文章

  1. 推荐一个关于.NET平台数据结构和算法的好项目
  2. 科学研究发现:说谎,是儿童成长的里程碑
  3. SharePoint 2013 配置基于AD的Form认证
  4. servlet web.xml学习笔记
  5. 【渝粤教育】国家开放大学2018年秋季 2202T公共行政学 参考试题
  6. java文本框双击可编辑_java swing 文本域双击变为可编辑
  7. Mybatis判断int类型是否为空
  8. GIT 添加多个git账号
  9. 为什么一定要重视隐式反馈?
  10. 使用PyTorch建立您的第一个文本分类模型
  11. 微pe工具箱 系统安装教程_微pe工具箱怎么安装win10系统?微pe工具箱安装win10系统详细教程...
  12. Linux log工具:zlog编译安装及使用示例(同样适用交叉编译环境)
  13. pandas to_excel产生空值的解决方案
  14. MSN聊天记录备份和还原方法
  15. Mac 本地起一个html 服务
  16. imx6ul rtc 驱动修改
  17. 创建图 figure figcaption
  18. 解决浏览器被毒霸篡改问题
  19. 【经典算法】·二分法
  20. python数据分析——择偶标准与黑名单

热门文章

  1. Hejr 6-8 - aamsaafanqs Blog - Blogster
  2. MySQL 讨厌哪种类型的查询
  3. Ubuntu 中安装 Oracle 10g
  4. js 两行之间的设置间距_厂房仓库的防火间距考点汇总
  5. python列表解析式如何使用_python列表推导式操作解析
  6. python查询结果写入excel_python实现查询的数据写入到excel
  7. 【ABAP】带PDF附件的邮件发送功能
  8. sap abap在表VBAP和VBAK上增加新字段的标准BAPI
  9. 销售订单的行项目里条件的增强
  10. SAP的号码范围(number range)SNRO和SNUM自动编号工具的用法