Linux -- inter-process communication -- Message Queue

Source: Internet
Author: User
Message Queue can make up for the lack of pipelines and achieve two-way data interaction. it is a method by which a process sends process blocks to another process. Unlike pipelines, pipelines are based on byte streams, message queues are based on messages, and reading of message queues is not necessarily FIFO. I. definition of Message Queue
Message Queue can make up for the lack of pipelines and achieve two-way data interaction. it is a method by which a process sends process blocks to another process. Unlike pipelines, pipelines are based on byte streams, message queues are based on messages, and reading of message queues is not necessarily FIFO.

II. create a Message Queue
Use the int messget (key_t key, int msgflg) function to create

Key: port number, which can be generated by ftok.
Msgflg:
If IPC_CRTAT does not exist, an IPC resource is created,
IPC_EXCL: generally used with IPC_CREAT to ensure that the obtained object is newly created, rather than opening the existing object.
3. read data to the message queue
Message retrieved from the queue by msgrcv

Ssize_t msgrcv (int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg );

Msgsnd puts messages into the queue

Int msgsnd (int msqid, const void * msgp, size_t msgsz, int msgflg );

IV. Set message queue attributes
Int msgctl (int msgqid, int cmd, struct msqid_ds * buf );

* ** You can use the man function name to view functions ***

Program code:

Coom. h

1 #pragma once    2 #include
 
      3 #include
  
       4 #include
   
        5 #include
    
         6 #include
     
          7 #include
      
        8 #define _PATH_ "." 9 #define _PROCID_ 0x776 10 #define _SIZE 1024 11 #define SERVE_MSGTYPE 1 12 #define CLIECT_MSGTYPE 2 13 typedef struct message 14 { 15 long mtype; 16 char mtext[_SIZE]; 17 }message; 18 int create_msg(int msg_num); 19 int drstroy_msg(int msg_id); 20 int set_msg(); 21 int get_msg(); 22 int msg_send(int msg_id,const char* msg,long type); 23 int msg_rec(int msg_id ,char buf[],long type);
      
     
    
   
  
 

Comm. c

1 #include"comm.h"    2  int create_msg(int msg_num)    3 {    4   key_t _key=ftok(_PATH_,_PROCID_);    5   if(_key < 0)    6   {    7     perror("ftok");    8     return -1;    9   }   10   int ret= msgget(_key,msg_num);   11    if(ret < 0)   12    {   13     perror("msgget");   14     return -1;   15    }   16  return ret;   17 }   18 int drstroy_msg(int msg_id)   19 {   20   if(msgctl(msg_id,IPC_RMID,NULL) < 0)   21   {   22     perror("msgctl");   23     return -1;   24   }else{   25     printf("remove message_queue\n");   26     return 0;   27   }   28 }   29 int set_msg()   30 {   31   umask(0);   32   return create_msg(IPC_CREAT |IPC_EXCL |0666);   33 }   34 int get_msg()   35 {   36     return create_msg(IPC_CREAT);   37 }   38 int msg_send(int msg_id,const char* msg,long type)   39 {   40   struct message _msg;   41   _msg.mtype=type;   42   strcpy(_msg.mtext,msg);   43   if(msgsnd(msg_id,&_msg,strlen(_msg.mtext),0)< 0)   44   {   45     perror("msg_send error");   46     return -1;   47   }   48   return 0;   49 }   50 int msg_rec(int msg_id,char buf[],long type)   51 {   52   struct message _msg;   53   memset(_msg.mtext,'\0',_SIZE);   54   if(msgrcv(msg_id,&_msg,_SIZE,type,0)< 0)   55   {   56     perror("msg_receve error");   57     return -1;   58   }   59   strcpy(buf,_msg.mtext);   60   return 0;   61 }   62

Client. c

1 #include"comm.h"    2 int main()    3 {    4  int msg_id=get_msg();    5  if(msg_id<0)    6  {    7   perror("error");    8   exit(1);    9  }   10   char buf[_SIZE];   11  while(1)   12  {   13   fflush(stdout);   14   printf("please client input: ");   15   memset(buf,'\0',_SIZE);   16   fgets (buf,sizeof(buf),stdin);   17   if(msg_send(msg_id,buf,CLIECT_MSGTYPE)< 0)   18     {   19       perror("send fail");   20       exit(1);   21     }   22    23   if(msg_rec(msg_id,buf,SERVE_MSGTYPE)<0)   24     {   25       perror("recve fail");   26       exit(1);   27     }   28   printf("serve:%s" ,buf);   29  }   30   return 0;   31 }

Server. c

1 #include "comm.h"    2 int main()    3 {    4   int msg_id=set_msg();    5   if(msg_id<0)    6   {    7     perror("mig_id");    8     exit(1);    9   }   10   printf("%d\n",msg_id);   11   char buf[_SIZE];   12   while(1)   13   {   14      if(msg_rec(msg_id,buf,CLIECT_MSGTYPE)< 0)   15     {   16       perror("recve fail");   17       exit(1);   18     }   19     else   20     {   21       printf("client :%s",buf);   22     }   23     printf("server please input: ");   24     fflush(stdout);   25     memset(buf,'\0',_SIZE);   26     fgets(buf,_SIZE,stdin);   27     if(msg_send(msg_id,buf,SERVE_MSGTYPE)<0)   28     {   29       perror("send fail");   30       exit(1);   31     }   32   }   33   drstroy_msg(msg_id);   34   return 0;   35 }

Running result:

The above is the content of Linux-inter-process communication-message queue. For more information, see PHP Chinese network (www.php1.cn )!

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.