认识dbus的基本概念

78 篇文章 0 订阅
15 篇文章 0 订阅
DBus是一种轻量级的进程间通信(IPC)机制,它支持1-1和1-n的通信模式。它引入了面向对象的概念,如对象、接口等。在DBus中,总线(bus)作为通信核心,由dbus-daemon管理。连接(connection)是进程与总线的交互方式,分为服务端(server)和客户端(client)连接,每个连接都有唯一名称。对象(objects)在连接上提供服务,通过代理(proxies)进行访问,同时支持方法(methods)调用和信号(signals)发布,实现类似面向对象的通信方式。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值