两进程通过消息队列相互通信,输入quit可以同时退出。
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<signal.h>
struct msgbuf{
longmtype;
charmtext[32];
};
int main(int argc, const char *argv[])
{
key_tkey=ftok("./",1);
if(key<0){
perror("ftok");
return-1;
}
intmsqid=msgget(key,IPC_CREAT|0666);
if(msqid<0){
perror("msgget");
return-1;
}
pid_tcpid=fork();
if(cpid==0){
while(1){
structmsgbuf snd;
memset(&snd,0,sizeof(snd));
snd.mtype=2;
//子进程负责写入数据
printf("请输入数据\n");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1]='\0';
//向消息队列中发送数据
if(msgsnd(msqid,&snd,sizeof(snd.mtext),0)<0)
{
perror("msgsnd");
return-1;
}
if(strcmp(snd.mtext,"quit")==0){
kill(getppid(),9);
exit(5);
}
}
}
if(cpid>0){
//父进程负责读取数据
structmsgbuf rcv;
while(1){
memset(&rcv,0,sizeof(rcv));
if(msgrcv(msqid,&rcv,sizeof(rcv.mtext),1,0)<0)
{
perror("msgrcv");
return-1;
}
if(strcmp(rcv.mtext,"quit")==0){
exit(5);
}
printf("%s\n",rcv.mtext);
}
}
if(cpid<0){
perror("fork");
return-1;
}
return0;
}
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<signal.h>
struct msgbuf{
longmtype;
charmtext[32];
};
int main(int argc, const char *argv[])
{
key_tkey=ftok("./",1);
if(key<0){
perror("ftok");
return-1;
}
intmsqid=msgget(key,IPC_CREAT|0666);
if(msqid<0){
perror("msgget");
return-1;
}
pid_tcpid=fork();
if(cpid==0){
//子进程负责写入数据
while(1){
structmsgbuf snd;
memset(&snd,0,sizeof(snd));
snd.mtype=1;
printf("请输入数据\n");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1]='\0';
//向消息队列中发送数据
if(msgsnd(msqid,&snd,sizeof(snd.mtext),0)<0)
{
perror("msgsnd");
return-1;
}
if(strcmp(snd.mtext,"quit")==0){
kill(getppid(),9);
_exit(5);
}
}
}
if(cpid>0){
//父进程负责读取数据
structmsgbuf rcv;
while(1){
memset(&rcv,0,sizeof(rcv));
if(msgrcv(msqid,&rcv,sizeof(rcv.mtext),2,0)<0)
{
perror("msgrcv");
return-1;
}
if(strcmp(rcv.mtext,"quit")==0){
_exit(5);
}
printf("%s\n",rcv.mtext);
}
}
if(cpid<0){
perror("fork");
return-1;
}
return0;
}