【IO】使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
目录
1、使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
2、使用有名管道实现两个进程间相互通信
1、使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
//create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建有名管道文件if(mkfifo("./linux",0664) == -1){perror("mkfifo error");return -1;}getchar();//按下回车后自动删除创建的管道文件system("rm ./linux");return 0;
}
//snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//以只写的形式打开管道文件int wfd = -1;if((wfd = open("./linux",O_WRONLY)) == -1){perror("open error");return -1;}//以读写的形式打开一个文件int destfd = -1;if((destfd = open("./dest.txt",O_RDWR|O_CREAT|O_TRUNC),0664) == -1){perror("open error");return -1;}printf("管道文件写端打开\n");//发送数据,定义一个容器char wbuf[128] = "";while(1){//输入数据printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);//将数据存入到文件中write(destfd,wbuf,sizeof(wbuf));wbuf[strlen(wbuf)-1] = 0; //将数据最后置位'\0',成为一个字符串//将数据发送到管道中write(wfd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit") == 0){break;}}//关闭文件描述符close(wfd);return 0;
}
//recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//以只写的形式打开管道文件int rfd = -1;if((rfd = open("./linux",O_RDONLY)) == -1){perror("open error");return -1;}printf("管道文件读端打开\n");//接收数据,定义一个容器char rbuf[128] = "";while(1){//清空容器bzero(rbuf,sizeof(rbuf));//从管道中读取数据read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit") == 0){break;}printf("收到的数据是:%s\n",rbuf);}//关闭文件描述符close(rfd);return 0;
}
输出结果如下:可以看出已经实现在一个进程输入,另一个进程中能够输出了,同时能够保存数据到文件中
2、使用有名管道实现两个进程间相互通信
//create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建两个有名管道if(mkfifo("./linux1",0664) == -1){perror("open1 error");return -1;}if(mkfifo("./linux2",0664) == -1){perror("open2 error");return -1;}getchar();system("rm linux1");system("rm linux2");return 0;
}
//snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建父子进程pid_t pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//子进程内容//以只读的形式打开有名管道1int rfd = open("./linux2",O_RDONLY);if(rfd == -1){perror("open1 error");return -1;}//定义接收容器char rbuf[128] = "";while(1){//初始化容器bzero(rbuf,sizeof(rbuf));//获取数据read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit") == 0){break;}printf("收到的消息为:%s\n",rbuf);}close(rfd);}//父进程内容//以只读的形式打开有名管道1int wfd = open("./linux1",O_WRONLY);if(wfd == -1){perror("open1 error");return -1;}printf("管道文件已经打开\n");//发送数据char wbuf[128] = "";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf) - 1] = 0;//将数据发送到管道里write(wfd,wbuf,sizeof(wbuf));//判断数据if(strcmp(wbuf,"quit") == 0){break;}}wait(NULL);return 0;
}
//recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建父子进程pid_t pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//子进程内容int wfd = open("./linux2",O_WRONLY);if(wfd == -1){perror("open1 error");return -1;}printf("管道文件已经打开\n");//发送数据char wbuf[128] = "";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf) - 1] = 0;//将数据发送到管道里write(wfd,wbuf,sizeof(wbuf));//判断数据if(strcmp(wbuf,"quit") == 0){break;}}close(wfd);}//父进程内容//以只读的形式打开有名管道1int rfd = open("./linux1",O_RDONLY);if(rfd == -1){perror("open1 error");return -1;}//定义接收容器char rbuf[128] = "";while(1){//初始化容器bzero(rbuf,sizeof(rbuf));//获取数据read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit") == 0){break;}printf("收到的消息为:%s\n",rbuf);}close(rfd);return 0;
}
输出结果如下:可以看出已经成功实现两个进程间的通信了