使用消息队列实现两个进程之间互相通信
进程A
#include <head.h>
//定义结构体
struct msgbuf
{
long mtype;//消息类型
char mtext[1024];//正文数据
};
//定义一个正文大小
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//1 创建key值
key_t key;
if((key=ftok("./",'k'))==-1)
{
perror("ftol error");
return -1;
}
//2 通过key值创建消息队列
int msgid; ///消息队列号
if((msgid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
//创建一个父子进程
pid_t cpid=fork();
//父进程
if(cpid>0)
{
//向消息队列中发送数据
struct msgbuf info ={.mtype=100};
while(1)
{
//清空里面内容
bzero(info.mtext,sizeof(info.mtext));
printf("请输入>>");
fgets(info.mtext,SIZE,stdin);//从终端读取数据
info.mtext[strlen(info.mtext)-1]=0;//将'\n'转化为\0
//调用发送函数
msgsnd(msgid,&info,SIZE,0);
//参数1向哪个队列发送数据
//参数2:要发送消息的地址
//参数3:要发送消息的大小
//参数4;阻塞形式发送
if(strcmp(info.mtext,"quit")==0)
{
break;
}
}
//删除消息队列
/* if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}*/
}
else if(cpid==0)
{
//从消息队列中读取数据
struct msgbuf info;//读取存储的数据
while(1)
{
//清空里面内容
bzero(info.mtext,sizeof(info.mtext));
//调用接受函数
msgrcv(msgid,&info,SIZE,200,0);
//参数1向哪个队列发送数据
//参数2:要发送消息的地址
//参数3:要发送消息的大小
//参数4;0表示从队列中读取第一个消息
//参数5:表示阻塞接受
printf("%s\n",info.mtext);
if(strcmp(info.mtext,"quit")==0)
{
break;
}
}
}
else
{
perror("fork error");
return -1;
}
return 0;
}
进程B
#include <head.h>
//定义结构体
struct msgbuf
{
long mtype;//消息类型
char mtext[1024];//正文数据
};
//定义一个正文大小
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//1 创建key值
key_t key;
if((key=ftok("./",'k'))==-1)
{
perror("ftol error");
return -1;
}
//2 通过key值创建消息队列
int msgid; ///消息队列号
if((msgid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
//创建一个父子进程
pid_t cpid=fork();
//子进程
if(cpid==0)
{
//从消息队列中读取数据
struct msgbuf info;//读取存储的数据
while(1)
{
//清空里面内容
bzero(info.mtext,sizeof(info.mtext));
//调用接受函数
msgrcv(msgid,&info,SIZE,100,0);
//参数1向哪个队列发送数据
//参数2:要发送消息的地址
//参数3:要发送消息的大小
//参数4;0表示从队列中读取第一个消息
//参数5:表示阻塞接受
printf("%s\n",info.mtext);
if(strcmp(info.mtext,"quit")==0)
{
break;
}
}
}
else if(cpid>0)
{
//向消息队列中发送数据
struct msgbuf info ={.mtype=200};
while(1)
{
//清空里面内容
bzero(info.mtext,sizeof(info.mtext));
printf("请输入>>");
fgets(info.mtext,SIZE,stdin);//从终端读取数据
info.mtext[strlen(info.mtext)-1]=0;//将'\n'转化为\0
//调用发送函数
msgsnd(msgid,&info,SIZE,0);
//参数1向哪个队列发送数据
//参数2:要发送消息的地址
//参数3:要发送消息的大小
//参数4;阻塞形式发送
if(strcmp(info.mtext,"quit")==0)
{
break;
}
}
//删除消息队列
/* if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}*/
}
else
{
perror("fork error");
return -1;
}
return 0;
}