send.c
#include<myhead.h>//定义消息类型
struct msgbuf
{long int mtype; //消息类型char mtext[1024]; //消息正文内容
};//宏定义一个消息大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, const char *argv[])
{//1、创建key值以便创建消息队列key_t key=ftok("/",'l');if(key==-1){perror("ftok error");return -1;}//2、使用key值,打开一个消息对列int msgid;if((msgid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建父子进程pid_t pid;pid=fork();if(pid<0){perror("fork error");return -1;}else if(pid==0) //子进程写入数据{struct msgbuf buf={.mtype=100};//3、向消息队列中存放数据//定义一个消息便量while(1){//清空数组bzero(buf.mtext,sizeof(buf.mtext));fgets(buf.mtext,sizeof(buf.mtext),stdin);//将'\n'换成'\0'buf.mtext[strlen(buf.mtext)-1]='\0';//将数据放入消息队列中if(msgsnd(msgid,&buf,MSGSIZE,0)!=0){perror("msgsnd error");return -1;}if(strcmp(buf.mtext,"quit")==0){break;}}exit(0);}else{ //父进程读取数据struct msgbuf buf1={.mtype=50};//向消息队列中读取数据//定义一个消息便量while(1){//清空数组bzero(buf1.mtext,sizeof(buf1.mtext));//从消息队列中读取数据//0表示阻塞形式进行取数据if(msgrcv(msgid,&buf1,MSGSIZE,50,0)==-1){perror("msgrcv error");return -1;}printf("读取的消息为:%s\n",buf1.mtext);if(strcmp(buf1.mtext,"quit")==0){break;}}wait(NULL);exit(0);}//删除消息队列if(msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}return 0;
}
recv.c
#include<myhead.h>//定义消息类型
struct msgbuf
{long int mtype; //消息类型char mtext[1024]; //消息正文内容
};//宏定义一个消息大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, const char *argv[])
{//1、创建key值以便创建消息队列key_t key=ftok("/",'l');if(key==-1){perror("ftok error");return -1;}//2、使用key值,打开一个消息对列int msgid;if((msgid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建父子进程pid_t pid;pid=fork();if(pid<0){perror("fork error");return -1;}else if(pid==0){struct msgbuf buf={.mtype=100};//3、向消息队列中读取数据//定义一个消息便量while(1){//清空数组bzero(buf.mtext,sizeof(buf.mtext));//从消息队列中读取数据//0表示阻塞形式进行取数据if(msgrcv(msgid,&buf,MSGSIZE,100,0)==-1){perror("msgrcv error");return -1;}printf("读取的消息为:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit")==0){break;}}exit(0);}else{struct msgbuf buf1={.mtype=50};//3、向消息队列中存放数据//定义一个消息便量while(1){//清空数组bzero(buf1.mtext,sizeof(buf1.mtext));fgets(buf1.mtext,sizeof(buf1.mtext),stdin);//将'\n'换成'\0'buf1.mtext[strlen(buf1.mtext)-1]='\0';//将数据放入消息队列中if(msgsnd(msgid,&buf1,MSGSIZE,0)!=0){perror("msgsnd error");return -1;}if(strcmp(buf1.mtext,"quit")==0){break;}}wait(NULL);exit(0);}//删除消息队列if(msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}return 0;
}
效果图: