張一弓
摘 要:OpenWrt是一款基于Linux內(nèi)核的開源路由器操作系統(tǒng),文章研究內(nèi)容是,利用Linux進程間通信中的命名管道方法,設計一系列接口函數(shù),提供消息的注冊、注銷、發(fā)送、接收。使消息傳遞在簡單、方便的同時,也能滿足路由器系統(tǒng)的要求。這種函數(shù)庫稱為消息總線。
關鍵詞:進程間通信(IPC);Linux;消息總線
1 消息總線設計需求
D-Bus消息總線是面向桌面系統(tǒng)設計,接口豐富,但占用資源較多。重新設計的消息總線將滿足占用系統(tǒng)資源少,且可以滿足路由器軟件系統(tǒng)的消息轉(zhuǎn)發(fā)需求。消息總線(Message Bus,以后簡稱M-Bus)模塊作為路由器軟件系統(tǒng)的基礎軟件模塊,M-Bus被設計成了一個為路由器操作系統(tǒng)各應用程序提供模塊間通信的唯一上層平臺。M-Bus自身被抽象化成一個提供進程間通信方法的函數(shù)功能庫,負責路由器軟件系統(tǒng)各模塊間的消息轉(zhuǎn)發(fā)和消息廣播,實現(xiàn)的方式是向整個系統(tǒng)提供C的API接口以供其他應用程序調(diào)用。M-Bus底層是使用套接字、信號量、管道等Linux基本進程間通信方法進行封裝。M-Bus在消息處理方式是消息的直接轉(zhuǎn)發(fā)。消息的直接轉(zhuǎn)發(fā)使用命名管道來實現(xiàn),參與通信的各個進程直接調(diào)用M-Bus庫函數(shù),各個應用程序根據(jù)自身注冊到消息總線上的消息處理函數(shù),做出下一步的動作。
2 消息總線總體設計
消息總線被設計成了一個為路由器操作系統(tǒng)各應用程序提供模塊間通信的唯一上層平臺。消息總線自身被抽象化成一個提供進程間通信方法的函數(shù)功能庫,負責路由器軟件系統(tǒng)各模塊間的消息轉(zhuǎn)發(fā)和消息廣播,實現(xiàn)的方式是向整個系統(tǒng)提供C的API接口以供其他應用程序調(diào)用。消息總線底層是使用套接字、信號量、管道等Linux基本進程間通信方法進行封裝。消息總線在消息處理方式是消息的直接轉(zhuǎn)發(fā)。消息的直接轉(zhuǎn)發(fā)使用命名管道來實現(xiàn),參與通信的各個進程直接調(diào)用消息總線庫函數(shù),各個應用程序根據(jù)自身注冊到消息總線上的消息處理函數(shù),做出下一步的動作。消息總線包括以下三個子模塊:(1)消息總線的接口集合,包括消息的發(fā)送、消息的接收、消息發(fā)送者與接收者的登記等一系列消息總線能夠提供的API函數(shù)。(2)消息總線的守護進程。(3)消息總線內(nèi)部工作處理,為上層API函數(shù)提供基礎。路由器的各應用程序通過調(diào)用消息總線的API函數(shù)來使用消息總線的功能。消息總線提供了本地資源初始化、銷毀本地資源、注冊、卸載、發(fā)送消息、接收消息、登記消息處理等API函數(shù)。消息總線中所定義的消息,是進程間傳遞數(shù)據(jù)的載體,消息的定義遵循以下原則:(1)每個消息都有自身的名字,消息的名字表示要發(fā)送的消息是什么命令。(2)消息的名字在系統(tǒng)中是唯一的。(3)系統(tǒng)能處理消息的種類的能力是有限的。各個模塊收到消息后會跟據(jù)消息的名字執(zhí)行相應的處理函數(shù),(4)消息具有統(tǒng)一定義的數(shù)據(jù)結構,包括消息頭、攜帶數(shù)據(jù)、消息上下文(Context)。消息的名字(也可稱為消息的類型)作為消息頭中的一個數(shù)據(jù)域的形式存在。
3 消息總線數(shù)據(jù)結構的設計
消息的自身是數(shù)據(jù)傳遞的載體并且消息具有相應的結構。消息結構組織分為兩類:一類是各模塊之間通信的消息結構;另一類是各模塊本地維護的消息結構。
其中,消息頭被定義成各模塊間通信的唯一結構,各模塊間的通信是通過解析消息頭來提取數(shù)據(jù),從而實現(xiàn)進程間的通信。而各模塊本地維護的消息結構稱之為消息上下文,每個模塊都會有自身的消息上下文,由各個模塊自己組織與管理,與外界隔離。圖1描述了消息頭的數(shù)據(jù)結構:
圖1 消息頭數(shù)據(jù)結構示意圖
消息頭中包含以下定義內(nèi)容:(1)消息的發(fā)送者:定義該消息是由哪個模塊發(fā)送的,路由器所有模塊的名稱均用宏定義。(2)當前進程PID:該消息的發(fā)送進程的PID。(3)消息的名字:該消息發(fā)的是什么指令。(4)消息的同步:當接收進程收到消息后需要做反饋操作,回復發(fā)送進程進行收到確認。如果不做同步操作則不需要回復。(5)數(shù)據(jù)長度:消息所攜帶的數(shù)據(jù)長度。(6)攜帶數(shù)據(jù)起始位:所攜帶數(shù)據(jù)的起始位地址。起始位地址加上所攜帶數(shù)據(jù)的長度就可以表示該消息攜帶的所有數(shù)據(jù),即消息的消息體。作者稱各模塊自身維護的消息為本地消息,描述本地消息的數(shù)據(jù)結構稱為消息上下文,路由器軟件系統(tǒng)中每個模塊(每個應用程序)自身只能存在一個消息上下文。設計消息上下文的原因在于是想把使用消息總線的所有數(shù)據(jù)與操作方式都組織到一起,然后封裝成統(tǒng)一的結構來進行描述。每個應用程序注冊到消息總線上的時候,都會生成自身的消息上下文。圖2描述了消息上下文的數(shù)據(jù)結構定義。
圖2 消息上下文數(shù)據(jù)結構示意圖
消息上下文中包括了以下內(nèi)容:(1)注冊到消息總線上的應用程序自身名字。名字由字符串表示,系統(tǒng)中所有的應用程序名字均使用宏進行定義。(2)當前注冊到消息總線上的進程ID。進程ID用于表示消息總線使用者的身份。(3)當前接收消息的文件描述符。當一個進程新注冊到消息總線上時,該文件描述符設置為-1。當該進程參與消息的發(fā)送或接收時,該文件描述符表示文件操作句柄。(4)進程退出函數(shù)指針,typedef void(*pf_user_exit)(void)。當一個已在消息總線上注冊過的進程想要從消息總線上卸載時,調(diào)用自身定義的退出函數(shù)實現(xiàn)退出。(5)消息處理函數(shù)指針。當應用程序收到消息時解析該消息,根據(jù)解析到的消息名字調(diào)用相對應的消息處理函數(shù)。當應用程序向消息總線上注冊時,必須注冊對應消息的處理函數(shù)。(6)默認消息處理函數(shù)指針。(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]Andrew.Network Security Hacks Lockhart[M].USA:Media Inc,2006:245-230.endprint
摘 要:OpenWrt是一款基于Linux內(nèi)核的開源路由器操作系統(tǒng),文章研究內(nèi)容是,利用Linux進程間通信中的命名管道方法,設計一系列接口函數(shù),提供消息的注冊、注銷、發(fā)送、接收。使消息傳遞在簡單、方便的同時,也能滿足路由器系統(tǒng)的要求。這種函數(shù)庫稱為消息總線。
關鍵詞:進程間通信(IPC);Linux;消息總線
1 消息總線設計需求
D-Bus消息總線是面向桌面系統(tǒng)設計,接口豐富,但占用資源較多。重新設計的消息總線將滿足占用系統(tǒng)資源少,且可以滿足路由器軟件系統(tǒng)的消息轉(zhuǎn)發(fā)需求。消息總線(Message Bus,以后簡稱M-Bus)模塊作為路由器軟件系統(tǒng)的基礎軟件模塊,M-Bus被設計成了一個為路由器操作系統(tǒng)各應用程序提供模塊間通信的唯一上層平臺。M-Bus自身被抽象化成一個提供進程間通信方法的函數(shù)功能庫,負責路由器軟件系統(tǒng)各模塊間的消息轉(zhuǎn)發(fā)和消息廣播,實現(xiàn)的方式是向整個系統(tǒng)提供C的API接口以供其他應用程序調(diào)用。M-Bus底層是使用套接字、信號量、管道等Linux基本進程間通信方法進行封裝。M-Bus在消息處理方式是消息的直接轉(zhuǎn)發(fā)。消息的直接轉(zhuǎn)發(fā)使用命名管道來實現(xiàn),參與通信的各個進程直接調(diào)用M-Bus庫函數(shù),各個應用程序根據(jù)自身注冊到消息總線上的消息處理函數(shù),做出下一步的動作。
2 消息總線總體設計
消息總線被設計成了一個為路由器操作系統(tǒng)各應用程序提供模塊間通信的唯一上層平臺。消息總線自身被抽象化成一個提供進程間通信方法的函數(shù)功能庫,負責路由器軟件系統(tǒng)各模塊間的消息轉(zhuǎn)發(fā)和消息廣播,實現(xiàn)的方式是向整個系統(tǒng)提供C的API接口以供其他應用程序調(diào)用。消息總線底層是使用套接字、信號量、管道等Linux基本進程間通信方法進行封裝。消息總線在消息處理方式是消息的直接轉(zhuǎn)發(fā)。消息的直接轉(zhuǎn)發(fā)使用命名管道來實現(xiàn),參與通信的各個進程直接調(diào)用消息總線庫函數(shù),各個應用程序根據(jù)自身注冊到消息總線上的消息處理函數(shù),做出下一步的動作。消息總線包括以下三個子模塊:(1)消息總線的接口集合,包括消息的發(fā)送、消息的接收、消息發(fā)送者與接收者的登記等一系列消息總線能夠提供的API函數(shù)。(2)消息總線的守護進程。(3)消息總線內(nèi)部工作處理,為上層API函數(shù)提供基礎。路由器的各應用程序通過調(diào)用消息總線的API函數(shù)來使用消息總線的功能。消息總線提供了本地資源初始化、銷毀本地資源、注冊、卸載、發(fā)送消息、接收消息、登記消息處理等API函數(shù)。消息總線中所定義的消息,是進程間傳遞數(shù)據(jù)的載體,消息的定義遵循以下原則:(1)每個消息都有自身的名字,消息的名字表示要發(fā)送的消息是什么命令。(2)消息的名字在系統(tǒng)中是唯一的。(3)系統(tǒng)能處理消息的種類的能力是有限的。各個模塊收到消息后會跟據(jù)消息的名字執(zhí)行相應的處理函數(shù),(4)消息具有統(tǒng)一定義的數(shù)據(jù)結構,包括消息頭、攜帶數(shù)據(jù)、消息上下文(Context)。消息的名字(也可稱為消息的類型)作為消息頭中的一個數(shù)據(jù)域的形式存在。
3 消息總線數(shù)據(jù)結構的設計
消息的自身是數(shù)據(jù)傳遞的載體并且消息具有相應的結構。消息結構組織分為兩類:一類是各模塊之間通信的消息結構;另一類是各模塊本地維護的消息結構。
其中,消息頭被定義成各模塊間通信的唯一結構,各模塊間的通信是通過解析消息頭來提取數(shù)據(jù),從而實現(xiàn)進程間的通信。而各模塊本地維護的消息結構稱之為消息上下文,每個模塊都會有自身的消息上下文,由各個模塊自己組織與管理,與外界隔離。圖1描述了消息頭的數(shù)據(jù)結構:
圖1 消息頭數(shù)據(jù)結構示意圖
消息頭中包含以下定義內(nèi)容:(1)消息的發(fā)送者:定義該消息是由哪個模塊發(fā)送的,路由器所有模塊的名稱均用宏定義。(2)當前進程PID:該消息的發(fā)送進程的PID。(3)消息的名字:該消息發(fā)的是什么指令。(4)消息的同步:當接收進程收到消息后需要做反饋操作,回復發(fā)送進程進行收到確認。如果不做同步操作則不需要回復。(5)數(shù)據(jù)長度:消息所攜帶的數(shù)據(jù)長度。(6)攜帶數(shù)據(jù)起始位:所攜帶數(shù)據(jù)的起始位地址。起始位地址加上所攜帶數(shù)據(jù)的長度就可以表示該消息攜帶的所有數(shù)據(jù),即消息的消息體。作者稱各模塊自身維護的消息為本地消息,描述本地消息的數(shù)據(jù)結構稱為消息上下文,路由器軟件系統(tǒng)中每個模塊(每個應用程序)自身只能存在一個消息上下文。設計消息上下文的原因在于是想把使用消息總線的所有數(shù)據(jù)與操作方式都組織到一起,然后封裝成統(tǒng)一的結構來進行描述。每個應用程序注冊到消息總線上的時候,都會生成自身的消息上下文。圖2描述了消息上下文的數(shù)據(jù)結構定義。
圖2 消息上下文數(shù)據(jù)結構示意圖
消息上下文中包括了以下內(nèi)容:(1)注冊到消息總線上的應用程序自身名字。名字由字符串表示,系統(tǒng)中所有的應用程序名字均使用宏進行定義。(2)當前注冊到消息總線上的進程ID。進程ID用于表示消息總線使用者的身份。(3)當前接收消息的文件描述符。當一個進程新注冊到消息總線上時,該文件描述符設置為-1。當該進程參與消息的發(fā)送或接收時,該文件描述符表示文件操作句柄。(4)進程退出函數(shù)指針,typedef void(*pf_user_exit)(void)。當一個已在消息總線上注冊過的進程想要從消息總線上卸載時,調(diào)用自身定義的退出函數(shù)實現(xiàn)退出。(5)消息處理函數(shù)指針。當應用程序收到消息時解析該消息,根據(jù)解析到的消息名字調(diào)用相對應的消息處理函數(shù)。當應用程序向消息總線上注冊時,必須注冊對應消息的處理函數(shù)。(6)默認消息處理函數(shù)指針。(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]Andrew.Network Security Hacks Lockhart[M].USA:Media Inc,2006:245-230.endprint
摘 要:OpenWrt是一款基于Linux內(nèi)核的開源路由器操作系統(tǒng),文章研究內(nèi)容是,利用Linux進程間通信中的命名管道方法,設計一系列接口函數(shù),提供消息的注冊、注銷、發(fā)送、接收。使消息傳遞在簡單、方便的同時,也能滿足路由器系統(tǒng)的要求。這種函數(shù)庫稱為消息總線。
關鍵詞:進程間通信(IPC);Linux;消息總線
1 消息總線設計需求
D-Bus消息總線是面向桌面系統(tǒng)設計,接口豐富,但占用資源較多。重新設計的消息總線將滿足占用系統(tǒng)資源少,且可以滿足路由器軟件系統(tǒng)的消息轉(zhuǎn)發(fā)需求。消息總線(Message Bus,以后簡稱M-Bus)模塊作為路由器軟件系統(tǒng)的基礎軟件模塊,M-Bus被設計成了一個為路由器操作系統(tǒng)各應用程序提供模塊間通信的唯一上層平臺。M-Bus自身被抽象化成一個提供進程間通信方法的函數(shù)功能庫,負責路由器軟件系統(tǒng)各模塊間的消息轉(zhuǎn)發(fā)和消息廣播,實現(xiàn)的方式是向整個系統(tǒng)提供C的API接口以供其他應用程序調(diào)用。M-Bus底層是使用套接字、信號量、管道等Linux基本進程間通信方法進行封裝。M-Bus在消息處理方式是消息的直接轉(zhuǎn)發(fā)。消息的直接轉(zhuǎn)發(fā)使用命名管道來實現(xiàn),參與通信的各個進程直接調(diào)用M-Bus庫函數(shù),各個應用程序根據(jù)自身注冊到消息總線上的消息處理函數(shù),做出下一步的動作。
2 消息總線總體設計
消息總線被設計成了一個為路由器操作系統(tǒng)各應用程序提供模塊間通信的唯一上層平臺。消息總線自身被抽象化成一個提供進程間通信方法的函數(shù)功能庫,負責路由器軟件系統(tǒng)各模塊間的消息轉(zhuǎn)發(fā)和消息廣播,實現(xiàn)的方式是向整個系統(tǒng)提供C的API接口以供其他應用程序調(diào)用。消息總線底層是使用套接字、信號量、管道等Linux基本進程間通信方法進行封裝。消息總線在消息處理方式是消息的直接轉(zhuǎn)發(fā)。消息的直接轉(zhuǎn)發(fā)使用命名管道來實現(xiàn),參與通信的各個進程直接調(diào)用消息總線庫函數(shù),各個應用程序根據(jù)自身注冊到消息總線上的消息處理函數(shù),做出下一步的動作。消息總線包括以下三個子模塊:(1)消息總線的接口集合,包括消息的發(fā)送、消息的接收、消息發(fā)送者與接收者的登記等一系列消息總線能夠提供的API函數(shù)。(2)消息總線的守護進程。(3)消息總線內(nèi)部工作處理,為上層API函數(shù)提供基礎。路由器的各應用程序通過調(diào)用消息總線的API函數(shù)來使用消息總線的功能。消息總線提供了本地資源初始化、銷毀本地資源、注冊、卸載、發(fā)送消息、接收消息、登記消息處理等API函數(shù)。消息總線中所定義的消息,是進程間傳遞數(shù)據(jù)的載體,消息的定義遵循以下原則:(1)每個消息都有自身的名字,消息的名字表示要發(fā)送的消息是什么命令。(2)消息的名字在系統(tǒng)中是唯一的。(3)系統(tǒng)能處理消息的種類的能力是有限的。各個模塊收到消息后會跟據(jù)消息的名字執(zhí)行相應的處理函數(shù),(4)消息具有統(tǒng)一定義的數(shù)據(jù)結構,包括消息頭、攜帶數(shù)據(jù)、消息上下文(Context)。消息的名字(也可稱為消息的類型)作為消息頭中的一個數(shù)據(jù)域的形式存在。
3 消息總線數(shù)據(jù)結構的設計
消息的自身是數(shù)據(jù)傳遞的載體并且消息具有相應的結構。消息結構組織分為兩類:一類是各模塊之間通信的消息結構;另一類是各模塊本地維護的消息結構。
其中,消息頭被定義成各模塊間通信的唯一結構,各模塊間的通信是通過解析消息頭來提取數(shù)據(jù),從而實現(xiàn)進程間的通信。而各模塊本地維護的消息結構稱之為消息上下文,每個模塊都會有自身的消息上下文,由各個模塊自己組織與管理,與外界隔離。圖1描述了消息頭的數(shù)據(jù)結構:
圖1 消息頭數(shù)據(jù)結構示意圖
消息頭中包含以下定義內(nèi)容:(1)消息的發(fā)送者:定義該消息是由哪個模塊發(fā)送的,路由器所有模塊的名稱均用宏定義。(2)當前進程PID:該消息的發(fā)送進程的PID。(3)消息的名字:該消息發(fā)的是什么指令。(4)消息的同步:當接收進程收到消息后需要做反饋操作,回復發(fā)送進程進行收到確認。如果不做同步操作則不需要回復。(5)數(shù)據(jù)長度:消息所攜帶的數(shù)據(jù)長度。(6)攜帶數(shù)據(jù)起始位:所攜帶數(shù)據(jù)的起始位地址。起始位地址加上所攜帶數(shù)據(jù)的長度就可以表示該消息攜帶的所有數(shù)據(jù),即消息的消息體。作者稱各模塊自身維護的消息為本地消息,描述本地消息的數(shù)據(jù)結構稱為消息上下文,路由器軟件系統(tǒng)中每個模塊(每個應用程序)自身只能存在一個消息上下文。設計消息上下文的原因在于是想把使用消息總線的所有數(shù)據(jù)與操作方式都組織到一起,然后封裝成統(tǒng)一的結構來進行描述。每個應用程序注冊到消息總線上的時候,都會生成自身的消息上下文。圖2描述了消息上下文的數(shù)據(jù)結構定義。
圖2 消息上下文數(shù)據(jù)結構示意圖
消息上下文中包括了以下內(nèi)容:(1)注冊到消息總線上的應用程序自身名字。名字由字符串表示,系統(tǒng)中所有的應用程序名字均使用宏進行定義。(2)當前注冊到消息總線上的進程ID。進程ID用于表示消息總線使用者的身份。(3)當前接收消息的文件描述符。當一個進程新注冊到消息總線上時,該文件描述符設置為-1。當該進程參與消息的發(fā)送或接收時,該文件描述符表示文件操作句柄。(4)進程退出函數(shù)指針,typedef void(*pf_user_exit)(void)。當一個已在消息總線上注冊過的進程想要從消息總線上卸載時,調(diào)用自身定義的退出函數(shù)實現(xiàn)退出。(5)消息處理函數(shù)指針。當應用程序收到消息時解析該消息,根據(jù)解析到的消息名字調(diào)用相對應的消息處理函數(shù)。當應用程序向消息總線上注冊時,必須注冊對應消息的處理函數(shù)。(6)默認消息處理函數(shù)指針。(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]Andrew.Network Security Hacks Lockhart[M].USA:Media Inc,2006:245-230.endprint