Linux多程序 訊息通訊 設計思想交流

2022-07-28 14:36:33 字數 1761 閱讀 4747

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中找到訪問入口 訊息佇列其實就是乙個訊息的鍊錶...