creat.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//创建一个有名管道文件,权限为664,a到b的单向通信
if (mkfifo("./myfifo_atob", 0664) == -1)
{
perror("mkfifo error");
return -1;
}
//创建一个有名管道文件,权限为664,b到a单向通信
if (mkfifo("./myfifo_btoa", 0664) == -1)
{
perror("mkfifo error");
return -1;
}
//使用函数阻塞主函数
getchar();
//删除管道文件
system("rm myfifo_atob");
system("rm myfifo_btoa");
return 0;
}
a.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd1, fd2;
if ((fd1 = open("./myfifo_atob", O_WRONLY)) == -1)
{
perror("open error");
return -1;
}
if ((fd2 = open("./myfifo_btoa", O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
pid_t pid = fork();
if (pid < 0)
{
perror("fork");
return -1;
}
if (pid > 0)
{
//循环往管道中写数据
while (1)
{
//定义数据容器
char buf[128];
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
//将数据写入有名管道文件中
write(fd1, buf, strlen(buf));
//如果输入的是quit则退出
if (strcmp(buf, "quit") == 0)
{
break;
}
}
//关闭文件指针
close(fd1);
}
else if (pid == 0)
{
//循环往管道中读数据
while (1)
{
//定义数据容器
char buf[128] = "";
//从有名管道文件中读取数据
read(fd2, buf, sizeof(buf));
printf("读取的数据为:%s\n", buf);
//如果读取的是quit则退出
if (strcmp(buf, "quit") == 0)
{
break;
}
}
//关闭文件指针
close(fd2);
}
return 0;
}
b.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd1, fd2;
if ((fd1 = open("./myfifo_atob", O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
if ((fd2 = open("./myfifo_btoa", O_WRONLY)) == -1)
{
perror("open error");
return -1;
}
pid_t pid = fork();
if (pid < 0)
{
perror("fork");
return -1;
}
else if (pid > 0)
{
//循环往管道中读数据
while (1)
{
//定义数据容器
char buf[128] = "";
//从有名管道文件中读取数据
read(fd1, buf, sizeof(buf));
printf("读取的数据为:%s\n", buf);
//如果读取的是quit则退出
if (strcmp(buf, "quit") == 0)
{
break;
}
}
//关闭文件指针
close(fd1);
}
else if (pid == 0)
{
//循环往管道中写数据
while (1)
{
//定义数据容器
char buf[128];
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
//将数据写入有名管道文件中
write(fd2, buf, strlen(buf));
//如果输入的是quit则退出
if (strcmp(buf, "quit") == 0)
{
break;
}
}
//关闭文件指针
close(fd2);
}
return 0;
}