代码:
processa.c
#include <stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
//创建一个结点
struct msgbuf
{
long mtype; //消息类型
char mtext[64]; //消息内容
};
struct rcvbuf
{
long rcvtype; //消息类型
char rcvtext[64]; //消息内容
};
int main(int argc, const char *argv[])
{
//申请一个KEY值
key_t key=ftok("./",1);
//创建消息队列
int msqid=msgget(key,IPC_CREAT|0664);
if(-1==msqid)
{
perror("msgget");
return -1;
}
struct msgbuf buf; //定义而结构体变量
pid_t pid=fork(); //创建一个子进程
if(pid>0)
{
//向消息队列中发送结点
while(1)
{
memset(&buf,0,sizeof(buf));
//从终端获取消息类型
printf("请输入消息类型>>>");
scanf("%ld",&buf.mtype);
getchar();
//从终端获取消息内容
printf("请输入消息内容>>>");
fgets(buf.mtext,sizeof(buf.mtext),stdin);
buf.mtext[strlen(buf.mtext)-1]=0;
if(msgsnd(msqid,&buf,sizeof(buf.mtext),0)<0)
{
perror("msgsnd");
return -1;
}
if(strcmp(buf.mtext,"quit")==0)
{
//给子进程发送退出信号
kill(0,9);
}
}
}
else if(0==pid)
{
struct rcvbuf rcv;
//向消息队列中接收结点
while(1)
{
if(-1==msgrcv(msqid,&rcv,sizeof(rcv.rcvtext),2,0))
{
perror("msgrcv");
return -1;
}
printf("接受到消息类型:%ld\n",rcv.rcvtype);
printf("接受到消息内容%s\n",rcv.rcvtext);
if(strcmp(rcv.rcvtext,"quit")==0)
{
//给子进程发送退出信号
kill(0,9);
}
}
}
else
{
perror("fork");
return -1;
}
return 0;
}
processb.c
#include <stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
//创建一个结点
struct msgbuf
{
long mtype; //消息类型
char mtext[64]; //消息内容
};
struct rcvbuf
{
long rcvtype; //消息类型
char rcvtext[64]; //消息内容
};
int main(int argc, const char *argv[])
{
//申请一个KEY值
key_t key=ftok("./",1);
//创建消息队列
int msqid=msgget(key,IPC_CREAT|0664);
if(-1==msqid)
{
perror("msgget");
return -1;
}
struct msgbuf buf; //定义而结构体变量
pid_t pid=fork(); //创建一个子进程
if(pid>0)
{
//向消息队列中发送结点
while(1)
{
memset(&buf,0,sizeof(buf));
//从终端获取消息类型
printf("请输入消息类型>>>");
scanf("%ld",&buf.mtype);
getchar();
//从终端获取消息内容
printf("请输入消息内容>>>");
fgets(buf.mtext,sizeof(buf.mtext),stdin);
buf.mtext[strlen(buf.mtext)-1]=0;
if(msgsnd(msqid,&buf,sizeof(buf.mtext),0)<0)
{
perror("msgsnd");
return -1;
}
if(strcmp(buf.mtext,"quit")==0)
{
//给子进程发送退出信号
kill(0,9);
}
}
}
else if(0==pid)
{
struct rcvbuf rcv;
//向消息队列中接收结点
while(1)
{
if(-1==msgrcv(msqid,&rcv,sizeof(rcv.rcvtext),1,0))
{
perror("msgrcv");
return -1;
}
printf("接受到消息类型:%ld\n",rcv.rcvtype);
printf("接受到消息内容%s\n",rcv.rcvtext);
if(strcmp(rcv.rcvtext,"quit")==0)
{
//给子进程发送退出信号
kill(0,9);
}
}
}
else
{
perror("fork");
return -1;
}
return 0;
}
效果:
