使用管道实现AB两个进程的相互通信(提示:每个程序都可以使用多进程、多线程)
create.c
创建2个有名管道
#include <myhead.h>
int main(int argc, const char *argv[])
{
//创建2个有名管道文件,权限为0664
if(mkfifo("./myfifo1",0664) == -1)
{
perror("mkfifo1 create error");
return -1;
}
if(mkfifo("./myfifo2",0664) == -1)
{
perror("mkfifo2 create error");
return -1;
}
//使用函数阻塞主函数
getchar();
//删除管道文件
system("rm myfifo1");
system("rm myfifo2");
return 0;
}
A.c
#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)
{
//子进程负责向文件1中中写数据
int fd; //文件描述符
char buf[128] ="";
//只写形式打开有名管道文件1
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
{
//父进程负责从文件1中读数据
int fd; //定义文件描述符
char buf[128] = "";
//只读形式打开文件2
if((fd = open("./myfifo2", 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;
}
B.c
#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)
{
//子进程负责向myfifo2管道中进行写数据
int fd; //文件描述符
char buf[128] ="";
//打开有名管道文件
if((fd = open("./myfifo2", 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
{
//父进程负责从myfifo1管道文件中读取数据
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;
}
运行结果如下(打开3个终端分别运行):
ubuntu@ubuntu:71pipe$ gcc create.c -o c.out
ubuntu@ubuntu:71pipe$ gcc A.c -o a.out
ubuntu@ubuntu:71pipe$ ./a.out
hello wrold
this is a perfect summer
end
quit
ubuntu@ubuntu:71pipe$
ubuntu@ubuntu:71pipe$ gcc B.c -o b.out
ubuntu@ubuntu:71pipe$ ./b.out
hello wrold
this is a perfect summer
end
quit
ubuntu@ubuntu:71pipe$
该文展示了如何用C语言通过创建有名管道(mkfifo)实现两个进程(A.c和B.c)之间的通信。每个进程都包含父进程和子进程,子进程负责写入数据到管道,父进程则从管道读取并显示数据。当输入quit时,通信结束。
291

被折叠的 条评论
为什么被折叠?



