认识dbus的基本概念

删除回忆录丶 提交于 2019-12-06 07:45:11

一. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!