博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
认识dbus的基本概念
阅读量:4056 次
发布时间:2019-05-25

本文共 2576 字,大约阅读时间需要 8 分钟。

一. 的认识

        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://ypoci.baihongyu.com/

你可能感兴趣的文章
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb在java中的应用
查看>>
区块链技术让Yotta企业云盘为行政事业服务助力
查看>>
Yotta企业云盘更好的为媒体广告业服务
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret 1.1 正在审核中
查看>>