两进程通过消息队列相互通信,输入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;
}
使用消息队列实现父子进程通信并退出
该程序展示了如何通过消息队列进行父子进程间的通信。子进程读取用户输入并发送到消息队列,父进程则从消息队列接收并打印数据。当输入quit时,子进程会结束其父进程。
689

被折叠的 条评论
为什么被折叠?



