admin 管理员组文章数量: 1184232
2024年3月13日发(作者:codeigniter3)
基于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 es on Routers[M].Hephaestus Books,2011:45-59.
[3]k Security Hacks Lockhart[M].USA:Media Inc,2006:
245-230.
版权声明:本文标题:基于OpenWrt平台的进程间通信 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1710260646a564914.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论