首页 > 范文大全 > 正文

基于OpenWrt平台的进程间通信

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于OpenWrt平台的进程间通信范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:OpenWrt是一款基于Linux内核的开源路由器操作系统,文章研究内容是,利用Linux进程间通信中的命名管道方法,设计一系列接口函数,提供消息的注册、注销、发送、接收。使消息传递在简单、方便的同时,也能满足路由器系统的要求。这种函数库称为消息总线。

关键词:进程间通信(IPC);Linux;消息总线

1 消息总线设计需求

D-Bus消息总线是面向桌面系统设计,接口丰富,但占用资源较多。重新设计的消息总线将满足占用系统资源少,且可以满足路由器软件系统的消息转发需求。消息总线(Message Bus,以后简称M-Bus)模块作为路由器软件系统的基础软件模块,M-Bus被设计成了一个为路由器操作系统各应用程序提供模块间通信的唯一上层平台。M-Bus自身被抽象化成一个提供进程间通信方法的函数功能库,负责路由器软件系统各模块间的消息转发和消息广播,实现的方式是向整个系统提供C的API接口以供其他应用程序调用。M-Bus底层是使用套接字、信号量、管道等Linux基本进程间通信方法进行封装。M-Bus在消息处理方式是消息的直接转发。消息的直接转发使用命名管道来实现,参与通信的各个进程直接调用M-Bus库函数,各个应用程序根据自身注册到消息总线上的消息处理函数,做出下一步的动作。

2 消息总线总体设计

消息总线被设计成了一个为路由器操作系统各应用程序提供模块间通信的唯一上层平台。消息总线自身被抽象化成一个提供进程间通信方法的函数功能库,负责路由器软件系统各模块间的消息转发和消息广播,实现的方式是向整个系统提供C的API接口以供其他应用程序调用。消息总线底层是使用套接字、信号量、管道等Linux基本进程间通信方法进行封装。消息总线在消息处理方式是消息的直接转发。消息的直接转发使用命名管道来实现,参与通信的各个进程直接调用消息总线库函数,各个应用程序根据自身注册到消息总线上的消息处理函数,做出下一步的动作。消息总线包括以下三个子模块:(1)消息总线的接口集合,包括消息的发送、消息的接收、消息发送者与接收者的登记等一系列消息总线能够提供的API函数。(2)消息总线的守护进程。(3)消息总线内部工作处理,为上层API函数提供基础。路由器的各应用程序通过调用消息总线的API函数来使用消息总线的功能。消息总线提供了本地资源初始化、销毁本地资源、注册、卸载、发送消息、接收消息、登记消息处理等API函数。消息总线中所定义的消息,是进程间传递数据的载体,消息的定义遵循以下原则:(1)每个消息都有自身的名字,消息的名字表示要发送的消息是什么命令。(2)消息的名字在系统中是唯一的。(3)系统能处理消息的种类的能力是有限的。各个模块收到消息后会跟据消息的名字执行相应的处理函数,(4)消息具有统一定义的数据结构,包括消息头、携带数据、消息上下文(Context)。消息的名字(也可称为消息的类型)作为消息头中的一个数据域的形式存在。

3 消息总线数据结构的设计

消息的自身是数据传递的载体并且消息具有相应的结构。消息结构组织分为两类:一类是各模块之间通信的消息结构;另一类是各模块本地维护的消息结构。

其中,消息头被定义成各模块间通信的唯一结构,各模块间的通信是通过解析消息头来提取数据,从而实现进程间的通信。而各模块本地维护的消息结构称之为消息上下文,每个模块都会有自身的消息上下文,由各个模块自己组织与管理,与外界隔离。图1描述了消息头的数据结构:

图1 消息头数据结构示意图

消息头中包含以下定义内容:(1)消息的发送者:定义该消息是由哪个模块发送的,路由器所有模块的名称均用宏定义。(2)当前进程PID:该消息的发送进程的PID。(3)消息的名字:该消息发的是什么指令。(4)消息的同步:当接收进程收到消息后需要做反馈操作,回复发送进程进行收到确认。如果不做同步操作则不需要回复。(5)数据长度:消息所携带的数据长度。(6)携带数据起始位:所携带数据的起始位地址。起始位地址加上所携带数据的长度就可以表示该消息携带的所有数据,即消息的消息体。作者称各模块自身维护的消息为本地消息,描述本地消息的数据结构称为消息上下文,路由器软件系统中每个模块(每个应用程序)自身只能存在一个消息上下文。设计消息上下文的原因在于是想把使用消息总线的所有数据与操作方式都组织到一起,然后封装成统一的结构来进行描述。每个应用程序注册到消息总线上的时候,都会生成自身的消息上下文。图2描述了消息上下文的数据结构定义。

图2 消息上下文数据结构示意图

消息上下文中包括了以下内容:(1)注册到消息总线上的应用程序自身名字。名字由字符串表示,系统中所有的应用程序名字均使用宏进行定义。(2)当前注册到消息总线上的进程ID。进程ID用于表示消息总线使用者的身份。(3)当前接收消息的文件描述符。当一个进程新注册到消息总线上时,该文件描述符设置为-1。当该进程参与消息的发送或接收时,该文件描述符表示文件操作句柄。(4)进程退出函数指针,typedef void(*pf_user_exit)(void)。当一个已在消息总线上注册过的进程想要从消息总线上卸载时,调用自身定义的退出函数实现退出。(5)消息处理函数指针。当应用程序收到消息时解析该消息,根据解析到的消息名字调用相对应的消息处理函数。当应用程序向消息总线上注册时,必须注册对应消息的处理函数。(6)默认消息处理函数指针。(7)消息头。

参考文献

[1]Bird Intern Articles on Routing Software openwrt[M].Hephaestus Books,2011:115-120.

[2]Jim Brown.Articles on Routers[M].Hephaestus Books,2011:45-59.

[3]work Security Hacks Lockhart[M].USA:Media Inc,2006:245-230.