LINUX下的DBUS

D-BUS是一种高效进程间通信机制,支持一对一和一对多通信,包括Methodcall、Methodreturn、Error和Signal四类消息。其特点是低延迟、低开销和高可用性。通信中涉及后台进程和域套接字,通过dbus系列函数进行连接、信号发送与接收、函数调用等操作。实例展示了如何连接总线、发送信号、调用方法以及提供远程调用的方法。
摘要由CSDN通过智能技术生成

D-BUS

  • DBUS是一种高级的进程间通信机制;支持一对一和一对多的对等通信
  • 连接到总线的进程可通过总线接收或传递消息,根据消息类型的不同进行不同的处理,DBUS可以分成以下四类:
    1. Methodcall消息:将触发一个函数调用
    2. Methodreturnxiaox:触发函数调用返回的结果
    3. Error消息:触发的函数调用返回一个异常
    4. Signal消息:通知,可以看作为事件消息

通信特点

  • DBUS是一种低延迟、低开销、高可用性的进程间通信机制
  • 可以提供以下高层的功能:
    1. 结构化的命名空间
    2. 独立于架构的数据格式
    3. 支持消息中的大部分通用数据元素
    4. 带有异常处理的通用远程调用接口
    5. 支持广播类型的通信

技术实现

实现原理
  • 在DBUS通信过程中,存在一个后台进程;后台进程和普通进程间信息交互是通过域套接字进行通信
  • DBUS通信
    1. 进程1先连接到总线(dbus_bus_get),然后构造信息(dbus_message_new_signal),然后再发送信息(dbus_connection_send)到后台进程,后台进程根据信息类型对消息进行不同处理(bus_dispatch_matches)
    2. 进程2接收信息前需求连接到总线,并告知总线需要的数据类型(dbus_bus_add_match),然后等待接收信息(dbus_connection_pop_message)
连接到总线
  • 通过调用函数(dbus_bus_get)实现与总线的连接建立
  • 在连接后需要调用函数(dbus_bus_request_name)为这个连接注册名称
  • 需要断开连接时需要调用函数(dbus_connection_close)将连接进行关闭
DBusConnection  *dbus_bus_get  (DBusBusType  type,  DBusError   *error)             /*  建立和总线的连接  */

int  dbus_bus_request_name  (DBusConnection   *connection,
                             const char         *name,
                             unsigned int        flags,
                             DBusError        *error)                                   /*  注册连接名称      */

void  dbus_connection_close  (DBusConnection  *connection)                           /*  关闭连接          */
信号发送与接收
信号发送
  • 信号是一个广播的消息,当发出一个信号,所有注册了接收对应信号的进程都会接收到信号
  • 进程发出信号前,先要创建一个DBusMessage对象来代表信号,然后追加上参数,然后再将数据发送给总线,最后释放掉消息对象即可
DBusMessage  *dbus_message_new_signal  (const  char  *path,
                                       const  char  *iface,
                                       const  char  *name)                       /*  创建信号类型消息      */
 
void  dbus_message_iter_init_append  ( DBusMessage     *message,
			               DBusMessageIter  *iter)                /*  加入参数到信号        */
 
dbus_bool_t  dbus_connection_send  ( DBusConnection  *connection,
                                     DBusMessage    *message,
                                     dbus_uint32_t    *serial)                       /*  发送信号到总线        */
 
void  dbus_message_unref  (DBusMessage *message)                                 /*  释放消息              */
信号接收
  • 进程想要接收信号时,需要告知总线自身感兴趣的消息,然后等待即可
void  dbus_bus_add_match  ( DBusConnection  *connection,
                            const char        *rule,
                            DBusError       *error)                                 /*  告知总线感兴趣的消息   */
 
DBusMessage  *dbus_connection_pop_message  ( DBusConnection  *connection)         /*  接收消息               */
 
dbus_bool_t  dbus_message_is_signal  (DBusMessage  *message,
                                      const char      *iface,
                                      const char     *signal_name)	                  /*  判断消息是否为信号     */
函数调用和提供函数调用
函数调用
  • 类似信号的发送,先创建一个消息,然后通过注册在DBUS上的名称指定发送的对象,然后追加参数
  • 调用的方式分为:
    • 阻塞式
    • 异步调用
DBusMessage  *dbus_message_new_method_call  (const char  *destination,
                                             const char  *path,
                                             const char  *iface,
                                             const char  *method)                    /*  创建一个函数调用消息    */
 
void  dbus_message_iter_init_append  (DBusMessage     *message,
			              DBusMessageIter  *iter)                     /*  为消息添加参数           */
 
dbus_bool_t  dbus_connection_send_with_reply  (DBusConnection   *connection,
                                               DBusMessage      *message, 
                                               DBusPendingCall  **pending_return,
                                               int            timeout_milliseconds)       /*  发送消息                */
 
void  dbus_pending_call_block  (DBusPendingCall  *pending)                           /*  阻塞等待返回值           */
 
DBusMessage  *dbus_pending_call_steal_reply  (DBusPendingCall  *pending)             /*  获得返回消息            */
  
dbus_bool_t  dbus_message_iter_init  (DBusMessage     *message,
			              DBusMessageIter  *iter)                     /*  获取参数                */
提供函数调用
  • 类似信号的接收,先告知总线感兴趣的消息,然后获取信息并获取参数进行函数执行,最后创建返回消息并发送到总线
void  dbus_bus_add_match  ( DBusConnection  *connection,
                            const char        *rule,
                            DBusError       *error
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值