1.思维导图
2.使用有名管道完成两个进程之间的通信
create.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(mkfifo("./myfifo1",0664)!=0)
{
perror("mkfifo1 error");
return -1;
}
printf("myfifo1 create success\n");
if(mkfifo("./myfifo2",0664)!=0)
{
perror("mkfifo2 error");
return -1;
}
printf("myfifo2 create success\n");
getchar();
system("rm myfifo1");
system("rm myfifo2");
return 0;
}
snd.c
#include <myhead.h>
/******************主程序***************/
int main(int argc, const char *argv[])
{
//定义进程号
pid_t pid=-1;
//创建子进程
pid=fork();
if(pid==0)
{
//定义文件描述符
int wfd=-1;
//以只写形式打开管道文件
if((wfd=open("./myfifo1",O_WRONLY))==-1)
{
perror("open error");
return -1;
}
printf("写端打开成功\n");
char wbuf[128]="";
//使用有名管道发送消息
while(1)
{
bzero(wbuf,sizeof(wbuf));//wbuf变量清零
printf("请输入>>>>>");
fflush(stdout);//刷新缓存区
read(0,wbuf,sizeof(wbuf));
wbuf[strlen(wbuf)-1]=0;
write(wfd,wbuf,sizeof(wbuf));
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
close(wfd);//关闭文件
exit(EXIT_SUCCESS);//退出子进程
}else if(pid > 0)
{
//定义文件描述符
int rfd=-1;
//以只读形式打开管道文件
if((rfd=open("./myfifo2",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
printf("读端打开成功\n");
char rbuf[128]="";
//使用有名管道接收消息
while(1)
{
bzero(rbuf,sizeof(rbuf));
read(rfd,rbuf,sizeof(rbuf));
printf("收到消息:%s\n",rbuf);
if(strcmp(rbuf,"quit")==0)
{
break;
}
}
close(rfd);
//回收子进程资源
wait(NULL);
}else
{
perror("fork error");
return -1;
}
return 0;
}
recv.c
#include <myhead.h>
/****************主程序***************/
int main(int argc, const char *argv[])
{
pid_t pid=-1;//定义进程号
pid=fork();//创建子进程
if(pid==0)
{
//定义文件描述符
int rfd=-1;
//以只读形式打开管道文件
if((rfd=open("./myfifo1",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
printf("读端打开成功\n");
char rbuf[128]="";
//使用有名管道接收消息
while(1)
{
bzero(rbuf,sizeof(rbuf));
read(rfd,rbuf,sizeof(rbuf));
printf("收到消息:%s\n",rbuf);
if(strcmp(rbuf,"quit")==0)
{
break;
}
}
close(rfd);
exit(EXIT_SUCCESS);
}else if(pid> 0)
{
//定义文件描述符
int wfd=-1;
//以只写形式打开管道文件
if((wfd=open("./myfifo2",O_WRONLY))==-1)
{
perror("open error");
return -1;
}
printf("写端打开成功\n");
char wbuf[128]="";
//使用有名管道发送消息
while(1)
{
bzero(wbuf,sizeof(wbuf));
printf("请输入>>>>>");
fflush(stdout);
read(0,wbuf,sizeof(wbuf));
wbuf[strlen(wbuf)-1]=0;
write(wfd,wbuf,sizeof(wbuf));
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
close(wfd);
//回收子进程资源
wait(NULL);
}else
{
perror("fork error");
return -1;
}
return 0;
}