使用多进程管道实现相互通信功能
源码:
demo1.c
//demo1.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//创建两个有名管道
if((mkfifo("./myfifo_u1_u2", 0664)) == -1){
perror("mkfifo_u1_u2 error");
return -1;
}
if((mkfifo("./myfifo_u2_u1", 0664)) == -1){
perror("mkfifo_u2_u1 error");
return -1;
}
//阻塞主函数
getchar();
//删除管道
system("rm myfifo_u1_u2");
system("rm myfifo_u2_u1");
return 0;
}
u1_u2.c
//u1_u2.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义两个文件描述符
int fd1, fd2;
//以两个不同的权限打开文件
if((fd1 = open("./myfifo_u1_u2", O_WRONLY)) == -1){
perror("open myfifo_u1_u2 error");
return -1;
}
if((fd2 = open("./myfifo_u2_u1", O_RDONLY)) == -1){
perror("open myfifo_u2_u1 error");
return -1;
}
//创建进程
pid_t pid = fork();
if(pid < 0){
perror("pid error");
return -1;
}else 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{
//子进程读第二个文件
while(1){
char buf[128] = "";
read(fd2, buf, sizeof(buf));
printf("[u2]: %s\n", buf);
//判断是否输入quit退出
if((strcmp(buf, "quit")) == 0){
break;
}
}
//关闭文件描述符
close(fd2);
}
return 0;
}
u2_u1.c
//u2_u1.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义两个文件描述符
int fd1, fd2;
//以两个不同的权限打开文件
if((fd1 = open("./myfifo_u1_u2", O_RDONLY)) == -1){
perror("open myfifo_u1_u2 error");
return -1;
}
if((fd2 = open("./myfifo_u2_u1", O_WRONLY)) == -1){
perror("open myfifo_u2_u1 error");
return -1;
}
//创建线程
pid_t pid = fork();
if(pid < 0){
perror("pid error");
return -1;
}else if(pid > 0){
//父进程读第一个文件
while(1){
char buf[128] = "";
read(fd1, buf, sizeof(buf));
printf("[u1]: %s\n", buf);
//判断是否输入quit退出
if((strcmp(buf, "quit")) == 0){
break;
}
}
//关闭文件描述符
close(fd1);
}else{
//子进程写第二个文件
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;
}