歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux多進程_消息通信_設計思想交流

Linux多進程_消息通信_設計思想交流

日期:2017/2/28 15:55:39   编辑:Linux教程
Linux進程間通信可以采用的方法很多,例如“管道”、“信號”、“共享內存”、“消息隊列”、“套接字”等等。不過,我個人比較喜歡“消息隊列”。

消息隊列和管道相比,至少有以下幾個特點:

(1)消息隊列是雙向、雙工的。

(2)如果進程數量較多,要互相通信,如果采用管道的話,要創建很多個管道文件。

(3)消息隊列先天就是“異步”操作,例如A進程丟進去,B進程再讀出來。A丟進去後,A還可以做其他事。不用管B什麼時候去讀。

例如:

消息發送函數

int SendMSG(int mqid,long mtype,std::string _msg)
{
struct UMMessage msg;

strcpy(msg.mtext,_msg.data());

msg.mtype=mtype;

msgsnd(mqid,&msg,strlen(msg.mtext)+1,0);

return 1;
}

(4)消息的讀取操作是阻塞方式的,在多線程編程裡,相當的省事

例如:

我們啟用一個專門的線程來接收消息

void *pthread_MsgHandle(void *arg) {
int mqid = *((int *) arg);
struct UMMessage msg;
while (1) {
//接收消息,根據 KB_MSG 過濾
int ret = msgrcv(mqid, &msg, MSG_TXT_LEN, KB_MSG, 0);
if (ret > 0) {
//處理消息
MessageProcessing(mqid, msg.mtext);
}
}

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

總之你有多少個進程要共用這個消息隊列,你就定義多少個。

Copyright © Linux教程網 All Rights Reserved