使用消息队列完成两个进程之间相互通信
Aprocsee.c
#include<myhead.h>
//要发送信息类型
struct msgbuf
{
long mtype;
char mtext[128];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)//信息内容大小
int main(int argc, char const *argv[])
{
//创建key值
key_t key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
//通过key值创建信息队列
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid==-1)
{
perror("msgget error");
return -1;
}
struct msgbuf buf;
//创建子进程
pid_t pid=fork();
if(pid==-1)
{
perror("fork error");
return -1;
}
//子进程读取消息
if(pid==0)
{
while(1)
{
msgrcv(msqid,&buf,SIZE,2,0);//读取2类型消息
printf("B:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
//父进程发送消息
else
{
while(1)
{
buf.mtype=1;//发送1类型消息
fgets(buf.mtext,SIZE,stdin);
buf.mtext[strlen(buf.mtext)-1]=0;
msgsnd(msqid,&buf,SIZE,0);
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
}
}
wait(NULL);
return 0;
}
Bprocess.c
#include<myhead.h>
//要发送信息类型
struct msgbuf
{
long mtype;
char mtext[128];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)//信息内容大小
int main(int argc, char const *argv[])
{
//创建key值
key_t key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
//通过key值创建信息队列
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid==-1)
{
perror("msgget error");
return -1;
}
struct msgbuf buf;
//创建子进程
pid_t pid=fork();
if(pid==-1)
{
perror("fork error");
return -1;
}
//子进程读取消息
if(pid==0)
{
while(1)
{
msgrcv(msqid,&buf,SIZE,1,0);//读取1类型消息
printf("A:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
//父进程发送消息
else
{
while(1)
{
buf.mtype=2;
fgets(buf.mtext,SIZE,stdin);//发送2类型消息
buf.mtext[strlen(buf.mtext)-1]=0;
msgsnd(msqid,&buf,SIZE,0);
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
}
}
wait(NULL);
//销毁消息队列
if(msgctl(msqid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}
return 0;
}