1、思维导图
2、使用管道实现AB两个进程之间的互相通信
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建管道文件
if(mkfifo("./myfifo", 0664))
{
perror("mkfifo error");
return -1;
}
if(mkfifo("./myfifo1", 0664))
{
perror("mkfifo1 error");
return -1;
}
//阻塞等待其他进程使用管道
getchar();
//用过代码执行终端指令
system("rm myfifo");
system("rm myfifo1");
return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid == 0) //子进程负责向myfifo中写数据
{
int fd; //文件描述符
char buf[128] ="";
//打开有名管道文件
if((fd = open("./myfifo", O_WRONLY)) == -1)
{
perror("open error");
return -1;
}
//循环往管道中写数据
while(1)
{
fgets(buf, sizeof(buf), stdin);
//清掉'\n'
buf[strlen(buf) - 1] = '\0';
//将输入写入管道中
write(fd, buf, strlen(buf));
//如果输入的是quit
if(strcmp(buf, "quit") == 0)
{
break;
}
}
//关闭文件
close(fd);
exit(EXIT_SUCCESS);
}else //父进程负责从myfifo中读数据
{
//定义文件描述符
int fd;
char buf[128] = "";
//打开文件
if((fd = open("./myfifo1", O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
while(1)
{
memset(buf, 0, sizeof(buf));
//从管道中读取数据
read(fd, buf, sizeof(buf));
if(strcmp(buf, "quit") == 0)
{
break;
}
printf("%s\n", buf); //将内容打印在终端上
}
close(fd); //关闭文件
wait(NULL);
}
return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid == 0) //子进程负责向myfifo1管道中进行写数据
{
int fd; //文件描述符
char buf[128] ="";
//打开有名管道文件
if((fd = open("./myfifo1", O_WRONLY)) == -1)
{
perror("open error");
return -1;
}
//循环往管道中写数据
while(1)
{
fgets(buf, sizeof(buf), stdin);
//清掉'\n'
buf[strlen(buf) - 1] = '\0';
//将输入写入管道中
write(fd, buf, strlen(buf));
//如果输入的是quit
if(strcmp(buf, "quit") == 0)
{
break;
}
}
//关闭文件
close(fd);
exit(EXIT_SUCCESS);
}else //父进程负责从myfifo管道文件中读取数据
{
//定义文件描述符
int fd;
char buf[128] = "";
//打开文件
if((fd = open("./myfifo", O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
while(1)
{
memset(buf, 0, sizeof(buf));
//从管道中读取数据
read(fd, buf, sizeof(buf));
if(strcmp(buf, "quit") == 0)
{
break;
}
printf("%s\n", buf); //将内容打印在终端上
}
close(fd); //关闭文件
wait(NULL);
}
return 0;
}