專利名稱:一種進程間通信方法
技術(shù)領(lǐng)域:
本發(fā)明涉及進程通信機制技術(shù)領(lǐng)域,尤其涉及一種進程間通信方法。
背景技術(shù):
網(wǎng)關(guān)設(shè)備由于其功能較為復(fù)雜,各功能模塊間交互較為頻繁,在已開發(fā)的網(wǎng)關(guān)設(shè) 備中,存在這樣一個管理程序它既要處理來自網(wǎng)絡(luò)側(cè)的網(wǎng)絡(luò)連接請求,同時又要與各種 程序間進行基于消息隊列的進程間通信,達到一個總體管理程序的功能。由于基于套接字 (socket)的網(wǎng)絡(luò)連接使用的是描述符,因而可以很容易的使用select/poll函數(shù),而消息 隊列由各自的標(biāo)識符標(biāo)識,這就意味著不能在消息隊列上直接使用select/poll函數(shù)。
對于上述問題,現(xiàn)有的解決方法讓服務(wù)端先創(chuàng)建一個管道,然后派生一個子進 程,由子進程阻塞在msgrcv調(diào)用中。當(dāng)有一個消息準(zhǔn)備好被處理時,返回msgrcv函數(shù),子 進程接著從所指定的隊列中讀出該消息,并把該消息寫入管道。服務(wù)端父進程當(dāng)時可能在 該管道以及一些網(wǎng)絡(luò)連接上select。但是這種方法中,消息被處理了三次一次是在子進 程使用msgrcv讀出時,一次是在子進程寫入管道時,最后一次是在父進程從該管道中讀出 時。當(dāng)然,對于這些額外的處理,同時增加了額外的系統(tǒng)開銷,效率也更低下。對應(yīng)的解決 方法是創(chuàng)建一個匿名共享內(nèi)存區(qū),派生一個子進程,讓該子進程阻塞在msgrcv調(diào)用中,以 將消息讀入到該匿名共享內(nèi)存區(qū)中,父進程再創(chuàng)建兩個管道,其中一個管道由子進程用來 向父進程通知已在共享內(nèi)存區(qū)中準(zhǔn)備好一個消息,另一個管道則由父進程用來向子進程通 知共享內(nèi)存區(qū)已可用。這就允許父進程對前一個管道的讀出端select可讀條件,同時對它 想要選擇的其他描述符select讀寫條件。然而,即使是這種解決方法,同樣還是較為繁瑣, 額外增加系統(tǒng)開銷,也大大增加編碼量。發(fā)明內(nèi)容
根據(jù)現(xiàn)有技術(shù)中存在的缺陷,現(xiàn)提供一種進程間通信方法的技術(shù)方案,具體包 括
一種進程間通信方法,適用于系統(tǒng)中的進程相互通信,其中,包括調(diào)用裝置、緩存 裝置、第一存儲裝置和第二存儲裝置,所述調(diào)用裝置分別連接所述緩存裝置、所述第一存儲 裝置和所述第二存儲裝置;所述第一存儲裝置用于存放所述進程間通信所需的消息隊列; 所述第二存儲裝置用于存放所述系統(tǒng)中的文件對象;所述調(diào)用裝置調(diào)取和寫入內(nèi)容至所述 第一存儲裝置和所述第二存儲裝置,并將調(diào)取的內(nèi)容暫時存放在所述緩存裝置中;
所述第一存儲裝置中包括多個獨立的第一存儲空間,每個所述第一存儲空間中存 放有一個消息隊列;所述第二存儲裝置中包括多個獨立的第二存儲空間,每個所述第二存 儲空間中存放有一個獨立的文件對象;
所述第一存儲裝置中還包括第一索引部件,所述第一索引部件分別連接多個所述 第一存儲空間;所述第一索引部件中包括多個獨立的第三存儲空間,每個所述第三存儲空 間中存放有一個索引節(jié)點,每個所述索引節(jié)點分別對應(yīng)并唯一標(biāo)識一個所述第一存儲空間中的消息隊列;每個所述索引節(jié)點中包括所述消息隊列的操作函數(shù);
所述第二存儲裝置中還包括第二索引部件,所述第二索引部件分別連接多個所述 第二存儲空間,每個所述第二索引部件包括多個獨立的第四存儲空間,每個所述第四存儲 空間中存放有一個描述符,每個所述描述符分別對應(yīng)并唯一標(biāo)識一個所述第二存儲空間中 的文件對象;每個所述描述符中包括所述文件對象的操作函數(shù);
所述進程間通信方法具體包括
步驟a,通過所述調(diào)用裝置在所述第一存儲裝置的所述第一存儲空間中調(diào)取一個 所述消息隊列并保存在所述緩存裝置中;
步驟b,通過所述調(diào)用裝置在所述第一索引部件的所述第三存儲空間中調(diào)取對應(yīng) 所述消息隊列的所述索引節(jié)點并保存在所述緩存裝置中;
步驟C,通過所述調(diào)用裝置在所述第二索引部件的所述第四存儲空間中調(diào)取一個 所述描述符并保存在緩存裝置中;
步驟d,通過所述調(diào)用裝置在所述第二存儲裝置的所述第二存儲空間中調(diào)取對應(yīng) 所述描述符的所述文件對象并保存在緩存裝置中;在儲存于所述緩存裝置中的所述消息隊 列和所述文件對象之間建立對應(yīng)關(guān)系;
步驟e,初始化所述緩存裝置中的所述索引節(jié)點和所述文件對象;
步驟f,所述調(diào)用裝置根據(jù)所述緩存裝置中的所述消息隊列,采用預(yù)設(shè)的方法重寫 所述緩存裝置中的所述文件對象;
步驟g,將重寫過的所述文件對象重新安裝回所述第二存儲裝置的對應(yīng)所述第二 存儲空間中;將所述描述符重新安裝回所述第二索引部件的對應(yīng)所述第四存儲空間中;
步驟h,返回所述緩存裝置中的所述描述符。
優(yōu)選的,該進程間通信方法,其中,每個所述第一存儲空間內(nèi)包括獨立的第一存儲 塊,所述第一存儲塊內(nèi)存放有對應(yīng)所述消息序列的參數(shù)值。
優(yōu)選的,該進程間通信方法,其中,每個所述第二存儲空間內(nèi)包括獨立的第二存儲 塊,所述第二存儲塊內(nèi)存放有對應(yīng)所述文件對象的參數(shù)值。
優(yōu)選的,該進程間通信方法,其中,所述步驟f中,所述預(yù)設(shè)的方法為
將所述緩存裝置中的所述消息隊列的參數(shù)值寫入所述緩存裝置中的所述文件對 象中以代替所述文件對象的參數(shù)值;
將所述緩存裝置中的所述文件對象的操作函數(shù)設(shè)置為所述緩存裝置中的所述消 息隊列的操作函數(shù);
將重寫過的所述文件對象重新安裝回所述第二存儲裝置中的對應(yīng)所述第二存儲 空間中。
上述技術(shù)方案的有益效果是可以同時處理網(wǎng)絡(luò)連接和基于消息隊列的通信,并 解決進程間通信效率低下的問題;為消息隊列中添加文件描述符標(biāo)識,從而可以使其支持 select/poll,進而更高效地處理網(wǎng)絡(luò)連接和進程間通信的需求。
圖1是本發(fā)明的實施例中對進程間通信的基礎(chǔ)結(jié)構(gòu)示意圖2是本發(fā)明的實施例中進程間通信方法的流程示意圖。
具體實施方式
下面結(jié)合附圖和具體實施例對本發(fā)明作進一步說明,但不作為本發(fā)明的限定。
如圖1所示,進程間通信方法依賴于基礎(chǔ)結(jié)構(gòu)包括調(diào)用裝置、緩存裝置、第一存 儲裝置和第二存儲裝置,調(diào)用裝置分別連接緩存裝置、第一存儲裝置和第二存儲裝置;第一 存儲裝置用于存放進程間通信所需的消息隊列;第二存儲裝置用于存放系統(tǒng)中的文件對 象;調(diào)用裝置調(diào)取和寫入內(nèi)容至第一存儲裝置和第二存儲裝置,并將調(diào)取的內(nèi)容暫時存放 在緩存裝置中。
第一存儲裝置中包括多個獨立的第一存儲空間(圖中只示出其中一個),每個第一 存儲空間中存放有一個消息隊列;第二存儲裝置中包括多個獨立的第二存儲空間(圖中只 示出其中一個),每個第二存儲空間中存放有一個獨立的文件對象。
第一存儲裝置中還包括第一索引部件,第一索引部件分別連接多個第一存儲空 間;第一索引部件中包括多個獨立的第三存儲空間(圖中只示出其中一個),每個第三存儲 空間中存放有一個索引節(jié)點,每個索引節(jié)點分別對應(yīng)并唯一標(biāo)識一個第一存儲空間中的消 息隊列。
第二存儲裝置中還包括第二索引部件,第二索引部件分別連接多個第二存儲空 間,第二索引部件中包括多個獨立的第四存儲空間(圖中只示出其中一個),每個第四存儲 空間中存放有一個描述符,每個描述符分別對應(yīng)并唯一標(biāo)識一個第二存儲空間中的文件對象。
每個第一存儲空間內(nèi)包括獨立的第一存儲塊,第一存儲塊內(nèi)存放有對應(yīng)消息序列 的參數(shù)值。
每個第二存儲空間內(nèi)包括獨立的第二存儲塊,第二存儲塊內(nèi)存放有對應(yīng)文件對象 的參數(shù)值。
為了編寫一個能同時處理網(wǎng)絡(luò)連接和基于消息隊列通信的服務(wù)器程序,需要在消 息隊列中添加文件描述符標(biāo)識,從而使其支持select/poll函數(shù),進而更高效地同時處理 網(wǎng)絡(luò)連接以及進程間通信的需求。
要使消息隊列支持select/poll函數(shù),就有必要先弄清楚select函數(shù)的工作模 式select函數(shù)是依賴于文件描述符來工作的,而這個文件描述符是定義在一個文件結(jié)構(gòu) 體中(即上文所述的第二索引部件),在該文件結(jié)構(gòu)體中,有一個叫做file_operations的函 數(shù)集(即上文所述的文件描述符中包括的操作函數(shù)),在這個file_operations的結(jié)構(gòu)體函 數(shù)中,有一個叫做poll的函數(shù)。Select函數(shù)就是通過調(diào)用poll函數(shù)來獲取文件描述符所 對應(yīng)的文件的狀態(tài)的,因此要使消息隊列支持select函數(shù),必須在消息隊列中添加文件描 述符標(biāo)識,具體方法如圖2所示
首先,注冊一個新的系統(tǒng)調(diào)用“_NR_mSgqt0fd”,在該系統(tǒng)調(diào)用中,通過調(diào)用裝置 的msgqid函數(shù)在第一存儲裝置中調(diào)取一個新的消息隊列,同時在對應(yīng)的第一索引部件中 獲取該消息隊列的索引節(jié)點inode,將上述消息隊列和索引節(jié)點均存入緩存裝置中以待 處理;隨后通過調(diào)用裝置在第二索引部件中獲取一個新的文件描述符,然后使用調(diào)用裝置 的get_empty_filp函數(shù)在第二存儲裝置中獲取對應(yīng)的文件對象f ile_structure,將上述 文件描述符和文件對象也存入緩存裝置中以待處理;在緩存裝置中的消息隊列和文件對象之間建立對應(yīng)關(guān)系,并初始化消息隊列的索引節(jié)點inode和與之對應(yīng)的文件對象file_ structure ;隨后采用索引節(jié)點中消息隊列的操作函數(shù)msgq_f ile_ops設(shè)置文件對象的操作函數(shù)f i I e_operat ions,采用消息隊列中的相關(guān)參數(shù)值設(shè)置文件對象的對應(yīng)參數(shù)值。最后將經(jīng)過設(shè)置的文件描述符的文件對象安裝回第二存儲裝置中的對應(yīng)位置,并返回該文件描述符。
為了實現(xiàn)消息隊列操作函數(shù)的poll功能,select函數(shù)最終還是需要進入到文件對象的操作函數(shù)中調(diào)用poll函數(shù)來獲取文件的相關(guān)狀態(tài)。因此,在確定消息隊列時,可以根據(jù)消息隊列的相關(guān)狀態(tài)進行一定設(shè)置若消息隊列中為空,則將對應(yīng)的標(biāo)志位設(shè)置為可寫;若消息隊列不為空,則將該標(biāo)志位設(shè)置為只讀,然后返回該標(biāo)志位。
為了對poll功能進行支持,可對現(xiàn)有的消息隊列的結(jié)構(gòu)體進行修改,在該消息隊列的結(jié)構(gòu)體上添加一個等待隊列頭(PO I l_wait);當(dāng)消息隊列被創(chuàng)建時,需要同時對該等待隊列頭進行初始化。消息隊列結(jié)構(gòu)體的定義如下
權(quán)利要求
1.一種進程間通信方法,適用于系統(tǒng)中的進程相互通信,其特征在于,包括調(diào)用裝置、 緩存裝置、第一存儲裝置和第二存儲裝置,所述調(diào)用裝置分別連接所述緩存裝置、所述第一存儲裝置和所述第二存儲裝置;所述第一存儲裝置用于存放所述進程間通信所需的消息隊列;所述第二存儲裝置用于存放所述系統(tǒng)中的文件對象;所述調(diào)用裝置調(diào)取和寫入內(nèi)容至所述第一存儲裝置和所述第二存儲裝置,并將調(diào)取的內(nèi)容暫時存放在所述緩存裝置中;所述第一存儲裝置中包括多個獨立的第一存儲空間,每個所述第一存儲空間中存放有一個消息隊列;所述第二存儲裝置中包括多個獨立的第二存儲空間,每個所述第二存儲空間中存放有一個獨立的文件對象;所述第一存儲裝置中還包括第一索引部件,所述第一索引部件分別連接多個所述第一存儲空間;所述第一索引部件中包括多個獨立的第三存儲空間,每個所述第三存儲空間中存放有一個索引節(jié)點,每個所述索引節(jié)點分別對應(yīng)并唯一標(biāo)識一個所述第一存儲空間中的消息隊列;每個所述索引節(jié)點中包括所述消息隊列的操作函數(shù);所述第二存儲裝置中還包括第二索引部件,所述第二索引部件分別連接多個所述第二存儲空間,每個所述第二索引部件包括多個獨立的第四存儲空間,每個所述第四存儲空間中存放有一個描述符,每個所述描述符分別對應(yīng)并唯一標(biāo)識一個所述第二存儲空間中的文件對象;每個所述描述符中包括所述文件對象的操作函數(shù);所述進程間通信方法具體包括步驟a,通過所述調(diào)用裝置在所述第一存儲裝置的所述第一存儲空間中調(diào)取一個所述消息隊列并保存在所述緩存裝置中;步驟b,通過所述調(diào)用裝置在所述第一索引部件的所述第三存儲空間中調(diào)取對應(yīng)所述消息隊列的所述索引節(jié)點并保存在所述緩存裝置中;步驟C,通過所述調(diào)用裝置在所述第二索引部件的所述第四存儲空間中調(diào)取一個所述描述符并保存在緩存裝置中;步驟d,通過所述調(diào)用裝置在所述第二存儲裝置的所述第二存儲空間中調(diào)取對應(yīng)所述描述符的所述文件對象并保存在緩存裝置中;在儲存于所述緩存裝置中的所述消息隊列和所述文件對象之間建立對應(yīng)關(guān)系;步驟e,初始化所述緩存裝置中的所述索引節(jié)點和所述文件對象;步驟f,所述調(diào)用裝置根據(jù)所述緩存裝置中的所述消息隊列,采用預(yù)設(shè)的方法重寫所述緩存裝置中的所述文件對象;步驟g,將重寫過的所述文件對象重新安裝回所述第二存儲裝置的對應(yīng)所述第二存儲空間中;將所述描述符重新安裝回所述第二索引部件的對應(yīng)所述第四存儲空間中;步驟h,返回所述緩存裝置中的所述描述符。
2.如權(quán)利要求1所述的進程間通信方法,其特征在于,每個所述第一存儲空間內(nèi)包括獨立的第一存儲塊,所述第一存儲塊內(nèi)存放有對應(yīng)所述消息序列的參數(shù)值。
3.如權(quán)利要求2所述的進程間通信方法,其特征在于,每個所述第二存儲空間內(nèi)包括獨立的第二存儲塊,所述第二存儲塊內(nèi)存放有對應(yīng)所述文件對象的參數(shù)值。
4.如權(quán)利要求3中所述的進程間通信方法,其特征在于,所述步驟f中,所述預(yù)設(shè)的方法為將所述緩存裝置中的所述消息隊列的參數(shù)值寫入所述緩存裝置中的所述文件對象中以代替所述文件對象的參數(shù)值;將所述緩存裝置中的所述文件對象的操作函數(shù)設(shè)置為所述緩存裝置中的所述消息隊列的操作函數(shù);將重寫過的所述文件對象重新安裝回所述第二存儲裝置中的對應(yīng)所述第二存儲空間 中。
全文摘要
本發(fā)明公開了一種進程間通信方法,其屬于進程通信機制技術(shù)領(lǐng)域,包括調(diào)用裝置、緩存裝置、第一存儲裝置和第二存儲裝置,步驟包括調(diào)取一個消息隊列及對應(yīng)的索引節(jié)點、一個文件對象及對應(yīng)的描述符并保存在緩存裝置中;在該消息隊列和文件對象之間建立對應(yīng)關(guān)系;初始化緩存裝置中的索引節(jié)點和文件對象;調(diào)用裝置根據(jù)緩存裝置中的消息隊列,重寫緩存裝置中的文件對象;將重寫過的文件對象重新安裝回第二存儲裝置的對應(yīng)第二存儲空間中;將描述符重新安裝回第二索引部件的對應(yīng)第四存儲空間中;返回緩存裝置中的描述符;上述技術(shù)方案的有益效果是可以同時處理網(wǎng)絡(luò)連接和基于消息隊列的通信,并解決進程間通信效率低下的問題。
文檔編號G06F9/54GK103064749SQ20131000834
公開日2013年4月24日 申請日期2013年1月9日 優(yōu)先權(quán)日2013年1月9日
發(fā)明者張曉冰 申請人:上海斐訊數(shù)據(jù)通信技術(shù)有限公司