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

 

          。。。。。等等。。。。 可能性实在太多。。。

 

我们现在用消息队列就是要解决这个问题。

问题看上去很难,实际上只要好好思考,就发现用消息队列很简单。

怎么思考呢?

   首先,要创建一个消息队列。

           Linux多进程_消息通信_设计思想交流

 然后做好消息接收【通道】定义。

例如:

      #define CH_A      1

      #define CH_B      2

      #define CH_C      3

      #define CH_D      4

      #define CH_E       5

      #define CH_F       6

总之你有多少个进程要共用这个消息队列,你就定义多少个。

相关推荐