实现两个进程的数据传递,进程A可以向B发送数据,B也可以向A发送数据
重要思想:进程A创建两个子进程,进程B也创建两个子进程,进程A和B实现对自身创建进程的资源回收,创建两个有名管道,进程A的子进程1发送,进程B的子进程2接收,进程B的子进程1发送,进程A的子进程2接收,实现两个进程的相互数据传递。
进程A:
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include <stdlib.h>
#include<string.h>
#define NUM 2
/* 实现A和B之间的通信 */
int main(int argc,const char *argv[])
{
//创建有名管道
mkfifo("/home/qf/a2b",0664);
mkfifo("/home/qf/b2a",0664);
int i;
pid_t pid;
int rfd,sfd;
/* 创建两个子进程 */
for( i=0;i<NUM;i++)
{
pid=fork();
if(pid<0)
{
perror("fork error");
exit(1);
}
if(pid==0) //避免子进程创建子进程
{
break;
}
}
/* 子进程1 */
if(i==0)
{
/* A发消息给B */
sfd = open("/home/qf/a2b",O_WRONLY);
assert(sfd>=0);
while(1)
{
char buf[128]="";
printf("请输入消息:\n");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;//去掉回车
write(sfd,buf,strlen(buf));
/* 输入bye退出 */
if(!strncmp(buf,"bye",3))
{
break;
}
}
exit(100);
}
/* 子进程2 */
else if(i == 1)
{
/* A收到B的消息 */
rfd = open("/home/qf/b2a",O_RDONLY);
assert(rfd>=0);
while(1)
{
char buf[128]="";
int len = read(rfd,buf,sizeof(buf));
printf("收到的消息:%s\n",buf);
if(len > 0)
{
if(strncmp(buf,"bye",3) == 0)
{
break;
}
}
else
{
break;
}
}
exit(20);
}
else if(i == NUM) //父进程
{
while(1)
{
pid_t rPid=waitpid(-1,NULL,WNOHANG);
if(rPid>0) //回收到子进程
{
printf("回收子进程%d\n",rPid);
}
else if(rPid<0) //没有子进程
{
break;
}
}
}
close(sfd);
close(rfd);
return 0;
}
进程B:
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include <stdlib.h>
#include<string.h>
#define NUM 2
/* 实现A和B之间的通信 */
int main(int argc,const char *argv[])
{
//创建有名管道
mkfifo("/home/qf/a2b",0664);
mkfifo("/home/qf/b2a",0664);
int i;
pid_t pid;
int rfd,sfd;
/* 创建两个子进程 */
for( i=0;i<NUM;i++)
{
pid=fork();
if(pid<0)
{
perror("fork error");
}
if(pid==0)//避免子进程创建子进程
{
break;
}
}
/* 子进程1 */
if(i==0)
{
/* B发消息给A */
sfd = open("/home/qf/b2a",O_WRONLY);
assert(sfd>=0);
while(1)
{
char buf[128]="";
printf("请输入消息:\n");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;//去掉回车
write(sfd,buf,strlen(buf));
if(strncmp(buf,"bye",3) == 0)
{
break;
}
}
exit(100);
}
/* 子进程2 */
else if(i == 1)
{
/* B收到A的消息 */
rfd = open("/home/qf/a2b",O_RDONLY);
assert(rfd>=0);
while(1)
{
char buf[128]="";
int len = read(rfd,buf,sizeof(buf));
printf("收到的信息:%s\n",buf);
if(len > 0)
{
if(strncmp(buf,"bye",3) == 0)
{
break;
}
}
else
{
break;
}
}
exit(20);
}
else if(i == NUM) //父进程
{
while(1)
{
pid_t rPid=waitpid(-1,NULL,WNOHANG);
if(rPid>0) //回收到子进程
{
printf("回收子进程%d\n",rPid);
}
else if(rPid<0) //没有子进程
{
break;
}
}
}
close(sfd);
close(rfd);
return 0;
}
分别运行A与B,终端输入数据,则可以读取数据。输入bye进程退出(但是需要在各自的终端分别输入bye才能都退出),A运行结果如下:
B运行结果如下: