在CSDN看到fmddlmyy写的关于DBUS的系列文章,下面是自己的一些心得体会。(fmddlmyy博客地址:http://blog.csdn.net/fmddlmyy/article/details/3585730) 这篇文章扩展的只有下面几句话: 1. 每个连接都有一个唯一名(unique-name); 2. 每个连接可以拥有一个公共名(well-known names); 3. 多个应用程序想拥有公共名时,可能会出现排队等待的情况; 在DBUS中有公共名和唯一名的概念,唯一名就是一个应用程序连接到bus 守护进程的时候,bus会自动给这个应用程序一个 唯一连接名(unique connection name)。这个连接名以“:”开头,由数字组成,每一个连接到bus守护进程的应用程序都会有一个唯一的这个名字,不可能重复,比如连接的唯一名可能为 ":1.81" 。当 一个应用程序有了这个连接名之后我们,称这个程序“拥有了这个名字”。但是一个连接还可以拥有一个公共名(well-known names),所谓的公共名就是它可以被任何连 接使用,而且这个公共名下面提供一些众所周知的服务,方法。刚才说过一个连接可以拥有一个名字,但是如果多个连接想拥有一个公共名呢,那么bus守护进程是如何处 理的,bus的总原则是:一个公共名在任何时刻只能被一个连接所拥有,当有多个连接想拥有一个公共名时,bus进程会将这些连接放到一个排队列表中,等待当前拥有者释放了这个公共名,然后才让列表中的一个连接拥有这个公共名。 看第一个例子: NO1: 获得一个唯一名
编译运行: # gcc bus11.c `pkg-config --cflags --libs dbus-glib-1` -o bus11 #./bus11 结果: unuqiename ->:1.154 代码比较简单,有点要注意:dbus_error_init (&error);这句话必须要加上,不然在运行的时候会出现如下错误: process 9656: arguments to internal_bus_get() were incorrect, assertion "(error) == NULL || !dbus_error_is_set ((error))" failed in file dbus-bus.c line 435.
This is normally a bug in some application using the D-Bus library.
D-Bus not built with -rdynamic so unable to print a backtrace
已放弃 (core dumped)
NO2:获得公共名 在上面代码做如下修改,
上面用到函数 dbus_bus_request_name(),它的原型如下:
DBUS_EXPORT int dbus_bus_request_name ( DBusConnection * connection,
const char * name,
unsigned int flags,
DBusError * error
)
第一个参数是你的连接,第二个参数你要请求给这个连接的公共名,第三个是标志位(比较重要的一个标志位),第四个错误参数。 这个函数的作用是让bus进程分配一个我指定的公共名给我。同样编译运行改运行程序,通过d-feet程序查看bus的相关信息: 我们看到,你只指定的公共名确实申请成功,而且它也有一个唯一名和公共名。 NO3:做个实验,我们将bus11.c拷贝一份,命名为bus22.c,编译bus22.c程序。 按照下面步骤运行: a. 先运行bu11.c程序,./bus11 b. 再开一个终端运行bus22.c程序,./bus22 c. 通过d-feet查看有什么结果。 疑问: 因为两个程序都是请求同一 公共名,但是dbus在同一时刻只能让一个连接获得这个公共名,那么是bus22获得还是bus11获得? 通过d-feet程序看出,bus11获得了这个公共名,而bus22在bus11睡眠10秒钟后才获得这个公共名。 uniquename每次都不一样的。10秒中之后,bus1退出之后,bus22再获得这个公共名,如下图: 结论:一个时刻,公共名只能被一个连接所拥有。 那有没有办法实现bus22不等待,直接替换掉这个公共名的拥有者呢? 办法有!这就涉及到函数dbus_bus_request_name()的第三个参数flag,标志位参数。它的值有下面3种情况: 下面用A和B分别代表上面的bus11和bus22程序,上面的公共名‘kjskjdf.sdkfja.kdkdkd’用NAME代替,下面解释上面各个参数的意思:
所以如果想实现刚才说的让bus22替换掉bus11,实现方法很简单,让bus11.c中的dbus_bus_request_name()第三个参数DBUS_NAME_FLAG_ALLOW_REPLACEME NT,bus22.c中的dbus_bus_request_name()第三个参数为DBUS_NAME_FLAG_REPLACE_EXISTING。 |
|