0
点赞
收藏
分享

微信扫一扫

实现进程间相互通信操作流程


龙大神随笔:
经典操作:ABC三个进程,实现三个进程之间任一通信。

//进程A
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>struct msgbuf{
long mtype;
char text[640];
};struct msgbuf t_msg,r_msg;
int msqid;
int main(void)
{
key_t key;
pid_t ret;key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);

ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
if(ret==0)
{
//child
while(1)
{

memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toB",t_msg.text,3)==0)
{
t_msg.mtype=2;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toC",t_msg.text,3)==0)
{
t_msg.mtype=4;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}

}

}else
{
//parent
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),1,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromB:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),3,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromC:%s\r\n",r_msg.text+4);
}
}
}

key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);

ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
if(ret==0)
{
//child
while(1)
{

memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toB",t_msg.text,3)==0)
{
t_msg.mtype=2;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toC",t_msg.text,3)==0)
{
t_msg.mtype=4;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}

}

}else
{
//parent
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),1,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromB:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),3,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromC:%s\r\n",r_msg.text+4);
}
}
}

}
//进程B
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>struct msgbuf{
long mtype;
char text[640];
};struct msgbuf t_msg,r_msg;
int msqid;
int main(void)
{
key_t key;
pid_t ret;key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);

ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
else if(ret==0)
{
//child
while(1)
{
memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toA",t_msg.text,3)==0)
{
t_msg.mtype=1;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toC",t_msg.text,3)==0)
{
t_msg.mtype=5;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
}

}else
{
//parent
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),2,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromA:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),6,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromC:%s\r\n",r_msg.text+4);
}
}
}

key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);

ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
else if(ret==0)
{
//child
while(1)
{
memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toA",t_msg.text,3)==0)
{
t_msg.mtype=1;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toC",t_msg.text,3)==0)
{
t_msg.mtype=5;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
}

}else
{
//parent
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),2,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromA:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),6,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromC:%s\r\n",r_msg.text+4);
}
}
}

}
//进程C
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>struct msgbuf{
long mtype;
char text[640];
};struct msgbuf t_msg,r_msg;
int msqid;
int main(void)
{
key_t key;
pid_t ret;

key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);

ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
else if(ret==0)
{
//child---send
while(1)
{
memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toA",t_msg.text,3)==0)
{
t_msg.mtype=3;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toB",t_msg.text,3)==0)
{
t_msg.mtype=6;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
}

}else
{
//parent---receive
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),4,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromA:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),5,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromB:%s\r\n",r_msg.text+4);
}
}


实现进程间相互通信操作流程_#include


举报

相关推荐

0 条评论