使用消息队列完成两个进程间相互通信
A.c
#include<myhead.h>
struct msgbuf
{
long mtype;
char mtext[1024];
};
//定义表示正文内容大小的宏
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//创建一个key值
key_t key;
key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
printf("ftok success key=%d\n",key);
//通过key值创建消息队列
int msqid=-1;
if((msqid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
printf("msgget success msqid=%d\n",msqid);
//创建父子进程
pid_t pid;
pid=fork();
if(pid>0)
{
//父进程,向消息队列中放入类型1的数据
struct msgbuf wbuf;
wbuf.mtype=1;
while(1)
{
bzero(wbuf.mtext,sizeof(wbuf.mtext));
printf("请输入内容:");
fgets(wbuf.mtext,sizeof(wbuf.mtext),stdin);
wbuf.mtext[strlen(wbuf.mtext)-1]=0;
//将消息放入队列中
msgsnd(msqid,&wbuf,MSGSIZE,0);
printf("发送成功\n");
if(strcmp(wbuf.mtext,"quit")==0)
{
break;
}
}
}
else if(pid==0)
{
//子进程,向消息队列中放入类型2的数据
struct msgbuf rbuf;
while(1)
{
bzero(rbuf.mtext,sizeof(rbuf.mtext));
msgrcv(msqid,&rbuf,MSGSIZE,2,0);
printf("收到的消息为:%s\n",rbuf.mtext);
if(strcmp(rbuf.mtext,"quit")==0)
{
break;
}
}
}
else
{
perror("fork error");
return -1;
}
return 0;
}
B.c
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1024];
};
//定义一个表示消息正文内容的大小的宏
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//创建一个key值
key_t key;
key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
printf("ftok success key=%d\n",key);
//通过key值创建消息队列
int msqid=-1;
if((msqid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
printf("msgget success msqid=%d\n",msqid);
//创建父子进程
pid_t pid;
pid=fork();
if(pid>0)
{
//父进程,向消息队列中读取类型1的数据
struct msgbuf rbuf;
rbuf.mtype=1;
while(1)
{
bzero(rbuf.mtext,sizeof(rbuf.mtext));
//从消息队列中读取一个消息
msgrcv(msqid,&rbuf,MSGSIZE,1,0);
printf("收到的消息为:%s\n",rbuf.mtext);
if(strcmp(rbuf.mtext,"quit")==0)
{
break;
}
}
}else if(pid==0)
{
//子进程,向消息队列中写入类型为2的数据
struct msgbuf wbuf;
wbuf.mtype=2;
while(1)
{
bzero(wbuf.mtext,sizeof(wbuf.mtext));
printf("请输入内容:");
fgets(wbuf.mtext,sizeof(wbuf.mtext),stdin);
wbuf.mtext[strlen(wbuf.mtext)]=0;
//将消息放入队列中
msgsnd(msqid,&wbuf,MSGSIZE,0);
printf("发送成功\n");
if(strcmp(wbuf.mtext,"quit")==0)
{
break;
}
}
}else
{
perror("fork error");
return -1;
}
return 0;
}
B.c
思维导图