一. dbus的认识
dbus是一用于进程间通信的一种设施,但不是简单的1-1关系的进程间通信,如果只是这些已经有很多成熟的技术可以采用:在windows下从简单的com、管道、内存共享到复杂的corba。dbus则更是更轻量级的ipc,不仅可以实现1-1,还可以实现1-n关系的ipc。它的使用面向对象化,就像使用面向对象语言进行ipc开发。引入object,interface等概念。
二. 下从dbus的代码开始认识他的概念。
1.bus,总线,假如由一个集线器和几台机器组成的网络是一个总线式网络,我们不从网络拓补那些理论上看这个网络,从物理上看就是总线网络:集线器是总线,机器都连到这根总线上就可以communtion了。dbus就是这样一个网络,bus相当于集线器,而在dbus系统里实际扮演这一角色的是dbus-daemon。
2. dbus connection. 一个connection就代表一个到bus上的连接,在集线器网络里,各个endpoint要通信,都要通过网线连接到集线器。dbus系统里,如果一个进程要与其他进程通信,也要通过这个dbus connection连接到dbus-daemon,不过这是一个tcp连接。我们来看下dbus获取一个连接的代码:
if (!init_connections_unlocked ())
{
_DBUS_UNLOCK (bus);
_DBUS_SET_OOM (error);
return NULL;
}
/* We want to use the activation address even if the
* activating bus is the session or system bus,
* per the spec.
*/
address_type = type;
/* Use the real type of the activation bus for getting its
* connection, but only if the real type's address is available. (If
* the activating bus isn't a well-known bus then
* activation_bus_type == DBUS_BUS_STARTER)
*/
if (type == DBUS_BUS_STARTER &&
bus_connection_addresses[activation_bus_type] != NULL)
type = activation_bus_type;
if (!private && bus_connections[type] != NULL)
{
connection = bus_connections[type];
dbus_connection_ref (connection);
_DBUS_UNLOCK (bus);
return connection;
}
address = bus_connection_addresses[address_type];
if (address == NULL)
{
dbus_set_error (error, DBUS_ERROR_FAILED,
"Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)");
_DBUS_UNLOCK (bus);
return NULL;
}
if (private)
connection = dbus_connection_open_private (address, error);
else
connection = dbus_connection_open (address, error);
这是dbus-bus.c internal_bus_get函数里的一段代码,获取DBusConnection都会到这里取。有三种类型的dbus connection:DBUS_BUS_SESSION、DBUS_BUS_SYSTEM、DBUS_BUS_STARTER, init_connections_unlocked 函数里先将这三种connection都创建好了并保存在bus_connections数组,再次获取直接从数组中读便是, 可见没个进程都只有一个到bus的连接。
dbus connection 分为两种类型,可简单的理解为提供服务的server connection 和 使用其他connection服务的client connection。每个dbus connection都有一个唯一的名字,client connection的名字是有dbus 自动分配的,而server connection的名字是有我们取的,称为well-known names。 这样client connection就能通过这个名字与此server connection通信。
3. objects
一个dbus connection上可以提供多种服务, objects就可理解为每个服务。dbus间的通信都是基于objects的,两个objects才构成一个enpoint-enpoint通信。
4. proxies
程序内访问一个object是通过proxies进行的,不过有些binding可能隐藏了这一概念,像java binding。在glib binding中,对object的访问都是通过proxies进行的。
glib binding 中的dbus_g_proxy_new 就是用于创建proxy,调用dubs 方法的api: dbus_g_proxy_call_no_reply 也是需要DBusGProxy作为参数的。
5. methods
object提供的函数,可供其他dbus 进程调用,完全就是面向对象的概念,好理解~
6. signals
object提供的信号,理解为object提供的回调~
来自:http://hi.baidu.com/ljc_9449/blog/item/1cf7318334ddbdb66c8119de.html
来源:CSDN
作者:别说郁闷
链接:https://blog.csdn.net/wangyunqian6/article/details/41244261