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 )!