ubus为openwrt平台开发中的进程间通信提供了一个通用的框架。它让进程间通信的实现变得非常简单,并且ubus具有很强的可移植性,可以很方便的移植到其他linux平台上使用。本文描述了ubus的实现原理和整体框架。
ubus源码可通过git库 git://nbd.name/luci2/ubus.git 获得,其依赖的ubox库的git库:git://nbd.name/luci2/ubox.git。
1. ubus的实现框架
ubus实现的基础是unix socket,即本地socket,它相对于用于网络通信的inet socket更高效,更具可靠性。unix socket客户端和服务器的实现方式和网络socket类似,读者如果还不太熟悉可查阅相关资料。
我们知道实现一个简单的unix socket服务器和客户端需要做如下工作:
- 建立一个socket server端,绑定到一个本地socket文件,并监听clients的连接。
- 建立一个或多个socket client端,连接server。
- client和server相互发送消息。
- client或server收到对方消息后,针对具体消息进行相应处理。
ubus同样实现了上述组件,并对socket连接以及消息传输和处理进行了封装:
- 1. ubus提供了一个socket server:ubusd。因此开发者不需要自己实现server端。
- 2. ubus提供了创建socket client端的接口,并且提供了三种现成的客户端供用户直接使用:
1) 为shell脚本提供的client端。
2) 为lua脚本提供的client接口。
3) 为C语言提供的client接口。
可见ubus对shell和lua增加了支持,后面会介绍这些客户端的用法。
- 3. ubus对client和server之间通信的消息格式进行了定义:client和server都必须将消息封装成json消息格式。
- 4. ubus对client端的消息处理抽象出“对象(object)”和“方法(method)”的概念。一个对象中包含多个方法,client需要向se