思维导图
练习
使用管道实现AB两个进程之间的互相通信
------------------------------------A.c------------------------------------
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fdA,fdB;
//定义一个子线程
pid_t pid = fork();
//定义容器
char bufA[128] = "", bufB[128] = "";
//打开文件A,myfifoA为B向A传输的信息
if((fdA = open("./myfifoA", O_RDONLY)) == -1)
{
perror("open myfifoA error");
return -1;
}
//打开文件B,myfifoB为A向B传输的信息
if((fdB = open("./myfifoB", O_WRONLY)) == -1)
{
perror("open myfifoB error");
return -1;
}
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
//子线程写数据
while(1)
{
//向管道B中写数据
//从终端向bufB中写数据
fgets(bufB, sizeof(bufB), stdin);
//清'\n'
bufB[strlen(bufB)-1] = '\0';
//写入管道
write(fdB, bufB, strlen(bufB));
//退出
if(strcmp(bufB, "quit") == 0)
break;
}
exit(EXIT_SUCCESS);
}else
{
//父进程读数据
while(1)
{
//读取管道A中的数据
//清bufA
memset(bufA, 0, sizeof(bufA));
//读数据
read(fdA, bufA, sizeof(bufA));
if(strcmp(bufA, "quit") == 0)
break;
printf("B->A: %s \n", bufA);
}
wait(NULL);
}
//关闭文件
close(fdA);
close(fdB);
return 0;
}
------------------------------------B.c------------------------------------
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义文件描述符
int fdA,fdB;
//定义一个子线程
pid_t pid = fork();
//定义容器
char bufA[128] = "", bufB[128] = "";
//打开文件A,myfifoA为B向A传输的信息
if((fdA = open("./myfifoA", O_WRONLY)) == -1)
{
perror("open myfifoA error");
return -1;
}
//打开文件B,myfifoB为A向B传输的信息
if((fdB = open("./myfifoB", O_RDONLY)) == -1)
{
perror("open myfifoB error");
return -1;
}
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
//子线程写数据
while(1)
{
//向管道A中写数据
//从终端向bufA中写数据
fgets(bufA, sizeof(bufA), stdin);
//清'\n'
bufA[strlen(bufA)-1] = '\0';
//写入管道
write(fdA, bufA, strlen(bufA));
//退出
if(strcmp(bufA, "quit") == 0)
break;
}
exit(EXIT_SUCCESS);
}else
{
//父进程读数据
while(1)
{
//读取管道B中的数据
//清bufB
memset(bufB, 0, sizeof(bufB));
//读数据
read(fdB, bufB, sizeof(bufB));
if(strcmp(bufB, "quit") == 0)
break;
printf("A->B: %s \n", bufB);
}
wait(NULL);
}
//关闭文件
close(fdA);
close(fdB);
return 0;
}
运行结果