歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

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