D-BUS
- DBUS是一种高级的进程间通信机制;支持一对一和一对多的对等通信
- 连接到总线的进程可通过总线接收或传递消息,根据消息类型的不同进行不同的处理,DBUS可以分成以下四类:
- Methodcall消息:将触发一个函数调用
- Methodreturnxiaox:触发函数调用返回的结果
- Error消息:触发的函数调用返回一个异常
- Signal消息:通知,可以看作为事件消息
通信特点
- DBUS是一种低延迟、低开销、高可用性的进程间通信机制
- 可以提供以下高层的功能:
- 结构化的命名空间
- 独立于架构的数据格式
- 支持消息中的大部分通用数据元素
- 带有异常处理的通用远程调用接口
- 支持广播类型的通信
技术实现
实现原理
- 在DBUS通信过程中,存在一个后台进程;后台进程和普通进程间信息交互是通过域套接字进行通信
-
- 进程1先连接到总线(dbus_bus_get),然后构造信息(dbus_message_new_signal),然后再发送信息(dbus_connection_send)到后台进程,后台进程根据信息类型对消息进行不同处理(bus_dispatch_matches)
- 进程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