linux程序間通訊可以採用的方法很多,例如「管道」、「訊號」、「共享記憶體」、「訊息佇列」、「套接字」等等。不過,我個人比較喜歡「訊息佇列」。
訊息佇列和管道相比,至少有以下幾個特點:
(1)訊息佇列是雙向、雙工的。
(2)如果程序數量較多,要互相通訊,如果採用管道的話,要建立很多個管道檔案。
(3)訊息佇列先天就是「非同步」操作,例如a程序丟進去,b程序再讀出來。a丟進去後,a還可以做其他事。不用管b什麼時候去讀。
例如:訊息傳送函式
int sendmsg(int mqid,long mtype,std::string _msg)
(4)訊息的讀取操作是阻塞方式的,在多執行緒程式設計裡,相當的省事
例如:我們啟用乙個專門的執行緒來接收訊息
void *pthread_msghandle(void *arg)
}return (void*) (1);
}那麼現在進入正題,談談需求。 假設現在有6個程序,相互之間要互相通訊。
程序名稱依次是:a、b、c、d、e、f
例如:a要傳送訊息給b、c、d
b要傳送訊息給d、e、f、a
c要傳送訊息給d、e、f
。。。。。等等。。。。 可能性實在太多。。。
我們現在用訊息佇列就是要解決這個問題。
問題看上去很難,實際上只要好好思考,就發現用訊息佇列很簡單。
怎麼思考呢?
首先,要建立乙個訊息佇列。
然後做好訊息接收【通道】定義。
例如:#define ch_a 1
#define ch_b 2
#define ch_c 3
#define ch_d 4
#define ch_e 5
#define ch_f 6
總之你有多少個程序要共用這個訊息佇列,你就定義多少個。
【通道】:
解釋哈,這個名詞不是linux的標準解釋,僅僅是我自己規定的,就像在高速公路的車行道裡規定的車道1(行車道)、車道2(貨車道)、車道3(超車道)的概念。
通道定義好了,那麼再定義訊息的**標示
例如:#define msg_a 1
#define msg_b 2
#define msg_c 3
#define msg_d 4
#define msg_e 5
#define msg_f 6
有同學問我,為什麼不直接採用通道標示呢? 原因很簡單。
在乙個通道裡可能有很多程序發來的訊息。 我們拿什麼識別呢? 就用訊息頭識別。
這些定義都有了,我們再看看linux訊息的結構體定義。
struct ummessage;
這些都定義完了,就來說說,怎麼收發訊息了。
首先:如果a要訊息給b,則這麼做。
在傳送訊息時,指定好【通道】名稱,即um_msg了
在訊息的內容裡,加上我們事先規定好的【****標示】
例如: msg_a=
那麼,a發給b的訊息就是
sendmsg(mqid,ch_b," msg_a= " ;
c發給b的訊息就是
sendmsg(mqid,ch_b," msg_c= " ;
那麼b怎麼處理訊息呢?
首先b會根據【訊息通道】號從訊息佇列中讀取自己的【訊息】
然後再根據訊息內容的【源標示】就可以識別訊息是誰發的了。
最後再根據 msg.mtext裡面的內容的 前面部分 msg_c 這個部分來識別是誰發的了。
python 多程序管道 訊息式通訊
from multiprocessing import process,pipe 匯入程序,管道模組 def f conn conn.send 1,test none conn.send 2,test none print conn.recv conn.close if name main pare...
PHP 多程序通訊 訊息佇列使用
向訊息佇列傳送資料和獲取資料的測試 key ftok file a 獲取訊息佇列 queue msg get queue key,0666 傳送訊息 msg send queue,1,hello,1 接收訊息,如果接收不到會阻塞 msg receive queue,1,message type,10...
Linux程序通訊 訊息佇列
1.訊息佇列 訊息佇列也稱為報文佇列,訊息佇列是隨核心持續的,只有在核心重起或顯示刪除乙個訊息佇列時,該訊息佇列才會真正刪除 系統中記錄訊息佇列的資料結構struct ipc ids msg ids位於核心中,系統中所有訊息佇列都可以在結構msg ids中找到訪問入口 訊息佇列其實就是乙個訊息的鍊錶...