使用有名管道,完成两个进程的相互通信
create.c
#include<myhead.h>int main(int argc, const char *argv[])
{//创建两个管道文件if(mkfifo("./myfifo1",0664)==-1){perror("myfifo1 create error");return -1;}if(mkfifo("./myfifo2",0664)==-1){perror("myfifo2 create error");return -1;}printf("两个管道文件创建成功\n");//阻塞进程结束getchar();system("rm myfifo1 myfifo2");return 0;
}
use1.c
#include<myhead.h>int main(int argc, const char *argv[])
{pid_t pid;pid=fork();//父进程从管道1中写数据//子进程从管道2中读数据if(pid>0){//父进程从管道1写数据int wfd=-1;if((wfd=open("./myfifo1",O_WRONLY))==-1){perror("open myfifo1 error");return -1;}char buf[128]="";while(1){//清空数据bzero(buf,sizeof(buf));//从终端输入数据printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';//将数据写入管道1write(wfd,buf,strlen(buf));if(strcmp(buf,"quit")==0){break;}}//关闭文件close(wfd);//回收子进程资源wait(NULL);}else if(pid==0){//子进程int rfd=-1;if((rfd=open("./myfifo2",O_RDONLY))==-1){perror("open myfifo2 error");return -1;}char buf[128]="";while(1){//清空数据bzero(buf,sizeof(buf));//读取管道2的内容read(rfd,buf,sizeof(buf));printf("读取的内容为:%s\n",buf);if(strcmp(buf,"quit")==0){break;}}//关闭文件close(rfd);//退出进程exit(EXIT_SUCCESS);}else{perror("fork create error");return -1;}return 0;
}
use2.c
#include<myhead.h>int main(int argc, const char *argv[])
{pid_t pid;pid=fork();//父进程从管道1中读数据//子进程从管道2中写数据if(pid==0){//子进程int wfd=-1;if((wfd=open("./myfifo2",O_WRONLY))==-1){perror("open myfifo2 error");return -1;}char buf[128]="";while(1){//清空数据bzero(buf,sizeof(buf));//从终端输入数据printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';//将数据写入管道1write(wfd,buf,strlen(buf));if(strcmp(buf,"quit")==0){break;}}//关闭文件close(wfd);//退出进程exit(EXIT_SUCCESS);}else if(pid>0){//父进程int rfd=-1;if((rfd=open("./myfifo1",O_RDONLY))==-1){perror("open myfifo1 error");return -1;}char buf[128]="";while(1){//清空数据bzero(buf,sizeof(buf));//读取管道2的内容read(rfd,buf,sizeof(buf));printf("读取的内容为:%s\n",buf);if(strcmp(buf,"quit")==0){break;}}//关闭文件close(rfd);//回收子进程资源wait(NULL);}else{perror("fork create error");return -1;}return 0;
}