zoukankan      html  css  js  c++  java
  • linux下dbus的理解学习

    最近在设计一个linux桌面程序。而进程间的交互准备使用dbus来解决。

    介绍:

    有那么个组织叫freedesktop,它是专门为linux桌面制定标准的。什么KDE,GNOME都是按他的标准来的。而dbus是其中的桌面消息机制的一个标准。

    dbus是一个IPC的管理系统,其实就底层来说就是本地socket通信。但是他是将所有的消息都通过总线的方式来管理分发,易于管理和安全。

    dbus一般就是3层结构:

    1. libdbus库,允许两个应用相互连接交换消息
    2. 一个建立在libdbus上的消息总线守护程序,这个守护程序可以路由消息
    3. 封装库,比如libdbus-glib或libdbus-qt。一般都是使用封装库来简化使用dbus的细节。

    一般gtk(c语言)开发的话,可以使用gobject-dbus库,qt(c++)的话可以使用dbus-qt库,而python使用python-dbus模块。

    还有nodejs的话,我推荐使用node-native模块(配合nodewebkit还是比较好用的)。

    还有做dbus相关开发的话,使用一个叫d-feet工具,就可以查看当前所有在使用中的dbus名称及其他属性。


    dbus分为两种总线,一种叫SystemBus,一种叫SessionBus。SystemBus就只有一条,SessionBus是一个用户会话时会产生一条。至于这两种的区别,SystemBus一般是用于权限较高的系统级(root)进程与其他进程(可以是普通进程)的通信,而SessionBus是用于普通的用户进程之间的交流。

    dbus是单对单的通信,其实和C/S架构差不多,一个server端接收消息和发布信号,多个client端发送消息和接收信号。

    dbus通信的话有5个值需要注意:

    1. Address:因为dbus也是通过本地socket来通信,所有会有socket文件。你可以直接连接这个sokcet文件的地址来通信,但这个我几乎不用。

    2. Bus Name:当你使用总线守护进程时(你看进程表里不是有很多dbus-daemon嘛,3层结构的第二层),你只用通过一个Bus Name就可以直接将消息路由到你想要的地址。所以这么方便,干嘛用上面的。server端想要Bus Name需要向SystemBus或SessionBus申请。如果不申请连接到dbus,它会自动被分配一个唯一的名字,就是1.45之类的,这数字没什么意义,只是为了名字唯一。名字除了路由消息还有第二种用途,就是当一个程序退出,断开连接,消息总线就会提醒其他连接程序该名字失去了所有者。这样就容易管理其他程序了

    3. Path:这个路径是指你在进程里的路径,你可以按模块来划分,比如NetwrokManager 有 无线和有线这两模块。

    4. Interface:他就像是一组功能的集合名字,你可以按功能来划分。

    5. Method/Signals:方法和信号,方法其实就是进程里的函数名,你发消息给这个函数名,这个函数就会被调用,并返回结果。信号就是当server端主动调用这个信号函数的时候,便会发出这个信号(信号名就是函数名),其他连接在同一总线上的程序,如果谁感兴趣就会接收处理。

    所以总的来说,其实可以这样理解,Address和Bus Name就相当于你家的城市地址,Path就相当于你家住哪个县哪个区,Interface就相当于你家哪个村哪个路,Method就相当于你家哪个人。dbus则充当了邮局的身份。

    那先尝试下发送个消息看看:

    d-feet在SystemBus下可以找到org.freedesktop.DBus这个Bus Name,它有个Path叫 “ / ”,“ / ”下面有org.freedesktop.DBus这个Interface,里面有个叫GetId的Methods,可以跟它通信一下。这里使用dbus-send命令来发送。dbus-send是dbus提供的一个命令,可直接向目标发送消息。

    ~ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId

    返回打印出了一个值,这个值就是GetId函数的执行结果。

    dbus-send使用方法: --system表示是System Bus,--print-reply表示打印回复信息, --desk=[Bus Name] [Path] [Interface].[Method] 表示地址,注意Method是接在Interface后面的。


    dbus python示例可以看http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html  比较详细

    dbus官方wiki:http://www.freedesktop.org/wiki/Software/dbus/
    ————————————————
    版权声明:本文为CSDN博主「Meowstic」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Wu_Roc/article/details/44516339

  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/heboxiang/p/14647818.html
Copyright © 2011-2022 走看看