思维导图
使用消息队列完成两个进程之间相互通信
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义结构体
struct msgbuf
{
long mtybe; //消息类型
char mtext[1024]; //消息正文
};
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))
int main(int argc, const char *argv[])
{
//定义进程号
pid_t pid;
//1、创建key值
key_t key = 0;
if((key = ftok("/",'t')) == -1)
{
perror("fork error");
return -1;
}
//2、使用key创建一个消息队列
int msqid = 0;
if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
pid=fork();
if(pid>0){
//定义一个消息类型的容器
struct msgbuf buf = {.mtybe=2};
//3、循环向队列中存放数据
while(1)
{
printf("请输入存放的数据:");
scanf("%s",buf.mtext);
getchar(); //吸收回车
//将消息存放到消息队列中
msgsnd(msqid,&buf,SIZE,0);
printf("发送成功\n");
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
}
else if(pid == 0)
{
//定义一个消息类型的容器
struct msgbuf buf={.mtybe=1};
//3、循环向队列中存放数据
while(1)
{
//从消息队列中读取消息
msgrcv(msqid,&buf,SIZE,1,0);
//第一个0表示无视类型,每次都取第一个消息
//第二个0表示阻塞形式接受消息
printf("收到的消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
wait(NULL);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>
//定义结构体
struct msgbuf
{
long mtybe; //消息类型
char mtext[1024]; //消息正文
};
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))
int main(int argc, const char *argv[])
{
//定义进程号
pid_t pid;
//1、创建key值
key_t key = 0;
if((key = ftok("/",'t')) == -1)
{
perror("fork error");
return -1;
}
//2、使用key创建一个消息队列
int msqid = 0;
if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
pid=fork();
if(pid>0){
//定义一个消息类型的容器
struct msgbuf buf={.mtybe=2};
//3、循环向队列中存放数据
while(1)
{
//从消息队列中读取消息
msgrcv(msqid,&buf,SIZE,2,0);
//第一个0表示无视类型,每次都取第一个消息
//第二个0表示阻塞形式接受消息
printf("收到的消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
}
else if(pid == 0)
{
//定义一个消息类型的容器
struct msgbuf buf = {.mtybe=1};
//3、循环向队列中存放数据
while(1)
{
printf("请输入存放的数据:");
scanf("%s",buf.mtext);
getchar(); //吸收回车
//将消息存放到消息队列中
msgsnd(msqid,&buf,SIZE,0);
printf("发送成功\n");
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
wait(NULL);
//4、删除消息队列
if(msgctl(msqid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}
return 0;
}