//cre_pipe.c----------管道的创建
#include<my_head.h>
int main(int argc, const char *argv[])
{
//创建两个有名管道文件
if(mkfifo("./myfifo1",0664) == -1)
{
perror("mkfifo1 error");
return -1;
}
if(mkfifo("./myfifo2",0664) == -1)
{
perror("mkfifo2 error");
return -1;
}
getchar(); //堵塞管道文件的删除
system("rm myfifo1 myfifo2"); //删除管道文件
return 0;
}
//process1.c-------------进程1
#include<my_head.h>
int main(int argc, const char *argv[])
{
//打开两个管道文件
int fd1,fd2;
if((fd1=open("./myfifo1",O_WRONLY)) == -1)
{
perror("open fd1 error");
return -1;
}
if((fd2=open("./myfifo2",O_RDONLY)) == -1)
{
perror("open fd2 error");
return -1;
}
//向管道1写数据
while(1)
{
char buf1[128];
fgets(buf1,sizeof(buf1),stdin); //从输入端获取数据
buf1[strlen(buf1)-1] = '\0';
write(fd1,buf1,strlen(buf1));
if(strcmp(buf1,"quit") == 0) //退出
break;
//从管道2读取数据
char buf2[128] = "";
read(fd2,buf2,sizeof(buf2));
if(strcmp(buf2,"quit") == 0) //退出
break;
printf("读取数据为:%s\n",buf2);
}
close(fd1);
close(fd2);
return 0;
}
//process2-------------进程2
#include<my_head.h>
int main(int argc, const char *argv[])
{
//打开两个管道文件
int fd1,fd2;
if((fd1=open("./myfifo1",O_RDONLY)) == -1)
{
perror("open fd1 error");
return -1;
}
if((fd2=open("./myfifo2",O_WRONLY)) == -1)
{
perror("open fd2 error");
return -1;
}
while(1)
{
//从管道1读取数据
char buf1[128] = "";
read(fd1,buf1,sizeof(buf1));
if(strcmp(buf1,"quit") == 0) //退出
break;
printf("读取数据为:%s\n",buf1);
//向管道2写数据
char buf2[128];
fgets(buf2,sizeof(buf2),stdin); //从输入端获取数据
buf2[strlen(buf2)-1] = '\0';
write(fd2,buf2,strlen(buf2));
if(strcmp(buf2,"quit") == 0) //退出
break;
}
close(fd1);
close(fd2);
return 0;
}
优化后---(创建父子进程,实现连续多次对管道的读写)
//cre_pipe.c----------管道的创建
#include<my_head.h>
int main(int argc, const char *argv[])
{
//创建两个有名管道文件
if(mkfifo("./myfifo1",0664) == -1)
{
perror("mkfifo1 error");
return -1;
}
if(mkfifo("./myfifo2",0664) == -1)
{
perror("mkfifo2 error");
return -1;
}
getchar(); //堵塞等待其他进程使用管道
//终端指令
system("rm myfifo1");
system("rm myfifo2");
return 0;
}
//pro_a.c---------A进程
#include<my_head.h>
int main(int argc, const char *argv[])
{
//a子进程向管道1写
//a父进程从管道2读
pid_t pid = fork();//创建子进程
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
//子进程向管道1写数据
int fd1;
char buf[128] = "";
if((fd1=open("./myfifo1",O_WRONLY)) == -1)
{
perror("open fd1 error");
return -1;
}
//循环写数据
while(1)
{
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = '\0'; //将'\n'变为'\0'
write(fd1,buf,strlen(buf)); //向管道写数据
if(strcmp(buf,"quit") == 0) //退出
{
break;
}
}
close(fd1); //关闭文件
exit(EXIT_SUCCESS);
}else
{
//父进程从管道2读数据
int fd2;
char buf[128] = "";
if((fd2=open("./myfifo2",O_RDONLY)) == -1)
{
perror("open fd2 error");
return -1;
}
//循环读数据
while(1)
{
memset(buf,0,sizeof(buf));
read(fd2,buf,sizeof(buf)); //从管道读数据
if(strcmp(buf,"quit") == 0) //退出
{
break;
}
printf("读取数据为:%s\n",buf);
}
close(fd2); //关闭文件
wait(NULL); //堵塞回收子进程资源
}
return 0;
}
//pro_b.c---------B进程
#include<my_head.h>
int main(int argc, const char *argv[])
{
//b子进程向管道2写
//b父进程从管道1读
pid_t pid = fork();
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
//子进程向管道2写数据
int fd1;
char buf[128] = "";
if((fd1=open("./myfifo2",O_WRONLY)) == -1)
{
perror("open fd1 error");
return -1;
}
//循环写数据
while(1)
{
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = '\0'; //将'\n'变为'\0'
write(fd1,buf,strlen(buf)); //向管道写数据
if((strcmp(buf,"quit")) == 0) //退出
{
break;
}
}
close(fd1); //关闭文件
exit(EXIT_SUCCESS);
}else
{
//父进程从管道1读数据
int fd2;
char buf[128] = "";
if((fd2=open("./myfifo1",O_RDONLY)) == -1)
{
perror("open fd2 error");
return -1;
}
//循环读数据
while(1)
{
memset(buf,0,sizeof(buf));
read(fd2,buf,sizeof(buf)); //从管道读数据
if(strcmp(buf,"quit") == 0) //退出
{
break;
}
printf("读取数据为:%s\n",buf);
}
close(fd2); //关闭文件
wait(NULL); //堵塞回收子进程资源
}
return 0;
}