使用消息队列实现两个程序的相互通信
s.c如下
cs
#include<my_head.h>
struct msgbuf
{
long mtype; //消息类型
char mtext[1024]; //消息正文
};
//宏定义一个消息正文的大小
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
//创建一个key值
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error\n");
return -1;
}
//创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
printf("s.out:msqid=%d\n",msqid);
//创建一个进程
pid_t pid = fork();
if(pid>0)
{
//父进程
struct msgbuf buf;
while(1)
{
printf("s.out父进程想要发送的消息类型:");
scanf("%ld",&buf.mtype);
getchar();
printf("请输入想要发送的正文:");
fgets(buf.mtext,SIZE,stdin); //终端获取
buf.mtext[strlen(buf.mtext)-1] = 0;
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
msgsnd(msqid,&buf,SIZE,0);
}
}
else if(pid == 0)
{
//子进程
struct msgbuf buf;
while(1)
{
//接收来自r.out子进程的消息
msgrcv(msqid,&buf,SIZE,1,0);
printf("取出的消息为:%s\n",buf.mtext);
}
}
return 0;
}
r.c如下
cs
#include<my_head.h>
struct msgbuf
{
long mtype;
char mtext[1024];
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
//创建一个key值
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error\n");
return -1;
}
//创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
printf("r.out:msqid=%d\n",msqid);
//创建一个进程
pid_t pid = fork();
if(pid>0)
{
struct msgbuf buf;
while(1)
{
//接收来自a.out父进程的消息
msgrcv(msqid,&buf,SIZE,1,0);
printf("取出的消息为:%s\n",buf.mtext);
}
}
if(pid == 0)
{
struct msgbuf buf;
while(1)
{
printf("请输入r,out子进程想要发送的消息类型:");
scanf("%ld",&buf.mtype);
getchar();
printf("请输入想要发送的正文:");
fgets(buf.mtext,SIZE,stdin);
buf.mtext[strlen(buf.mtext)-1] = 0;
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
msgsnd(msqid,&buf,SIZE,0);
}
} return 0;
}
运行结果如图
思维导图