认识dbus的基本概念

2023-11-21 18:58
文章标签 认识 基本概念 dbus

本文主要是介绍认识dbus的基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于认识dbus的基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404388

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

【Rocketmq入门-基本概念】

Rocketmq入门-基本概念 名词解释名称服务器(NameServer)消息队列(Message Queue)主题(Topic)标签(Tag)生产者(Producer)消费者(Consumer)拉取模式(Pull)推送模式(Push)消息模型(Message Model) 关键组件Broker消息存储工作流程 名词解释 名称服务器(NameServer) 定义: 名称服务器

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么? HTML是什么? 如何运行HTML文件? 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关  项目合作管理相关  后话 前言 本系列的博客将分享前端HTML的相关知识点。 本篇作为本系列的第一期博客,主要讲解H

认识鬼火引擎

一、Irrlicht简介 (1)概念Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台)、OpenGL 或它自己的软件着色程序,可以实现该引的完​全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(

Jenkins--pipeline认识及与RF文件的结合应用

什么是pipeline? Pipeline,就是可运行在Jenkins上的工作流框架,将原本独立运行的单个或多个节点任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。 为什么要使用pipeline? 1.流程可视化显示 2.可自定义流程任务 3.所有步骤代码化实现 如何使用pipeline 首先需要安装pipeline插件: 流水线有声明式和脚本式的流水线语法 流水线结构介绍 Node: