经典操作:ABC三个进程,实现三个进程之间任一通信。
//进程A
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> struct msgbuf{ long mtype; char text[640]; }; struct msgbuf t_msg,r_msg; int msqid; int main(void) { key_t key; pid_t ret;
key=ftok("./1234.txt",1); msqid = msgget(key,IPC_CREAT|0600); printf("msqid=%d\r\n",msqid); ret=fork(); if(ret==-1) { perror("fork failed\r\n"); return -1; } if(ret==0) { //child while(1) { memset(&t_msg,0,sizeof(t_msg)); scanf("%s",t_msg.text); if(strncmp("toB",t_msg.text,3)==0) { t_msg.mtype=2; msgsnd(msqid,&t_msg,sizeof(t_msg.text),0); } if(strncmp("toC",t_msg.text,3)==0) { t_msg.mtype=4; msgsnd(msqid,&t_msg,sizeof(t_msg.text),0); } } }else { //parent int len1,len2; while(1) { len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),1,IPC_NOWAIT); if(len1==-1) { ; } else { printf("fromB:%s\r\n",r_msg.text+4); } len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),3,IPC_NOWAIT); if(len2==-1) { ; } else { printf("fromC:%s\r\n",r_msg.text+4); } } }
//进程B
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> struct msgbuf{ long mtype; char text[640]; }; struct msgbuf t_msg,r_msg; int msqid; int main(void) { key_t key; pid_t ret;
key=ftok("./1234.txt",1); msqid = msgget(key,IPC_CREAT|0600); printf("msqid=%d\r\n",msqid); ret=fork(); if(ret==-1) { perror("fork failed\r\n"); return -1; } else if(ret==0) { //child while(1) { memset(&t_msg,0,sizeof(t_msg)); scanf("%s",t_msg.text); if(strncmp("toA",t_msg.text,3)==0) { t_msg.mtype=1; msgsnd(msqid,&t_msg,sizeof(t_msg.text),0); } if(strncmp("toC",t_msg.text,3)==0) { t_msg.mtype=5; msgsnd(msqid,&t_msg,sizeof(t_msg.text),0); } } }else { //parent int len1,len2; while(1) { len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),2,IPC_NOWAIT); if(len1==-1) { ; } else { printf("fromA:%s\r\n",r_msg.text+4); } len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),6,IPC_NOWAIT); if(len2==-1) { ; } else { printf("fromC:%s\r\n",r_msg.text+4); } } }
//进程C
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> struct msgbuf{ long mtype; char text[640]; }; struct msgbuf t_msg,r_msg; int msqid; int main(void) { key_t key; pid_t ret;
key=ftok("./1234.txt",1); msqid = msgget(key,IPC_CREAT|0600); printf("msqid=%d\r\n",msqid); ret=fork(); if(ret==-1) { perror("fork failed\r\n"); return -1; } else if(ret==0) { //child---send while(1) { memset(&t_msg,0,sizeof(t_msg)); scanf("%s",t_msg.text); if(strncmp("toA",t_msg.text,3)==0) { t_msg.mtype=3; msgsnd(msqid,&t_msg,sizeof(t_msg.text),0); } if(strncmp("toB",t_msg.text,3)==0) { t_msg.mtype=6; msgsnd(msqid,&t_msg,sizeof(t_msg.text),0); } } }else { //parent---receive int len1,len2; while(1) { len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),4,IPC_NOWAIT); if(len1==-1) { ; } else { printf("fromA:%s\r\n",r_msg.text+4); } len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),5,IPC_NOWAIT); if(len2==-1) { ; } else { printf("fromB:%s\r\n",r_msg.text+4); } } }