IO 7
一、思维导图
二、练习题
1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
//创建有名管道
#include<myhead.h> int main(int argc, const char *argv[]) { //创建一个有名管道文件 if(mkfifo("./pipefile",0664) == -1) { perror("mkfifo error"); return -1; } printf("create success\n"); return 0; }//发送数据到有名管道
#include<myhead.h> int main(int argc, const char *argv[]) { //发送数据 //以写的形式打开管道文件 int wfd = open("./pipefile",O_WRONLY); if(wfd == -1) { perror("open error"); return -1; } printf("open pipe write success\n"); //定义容器从标准输入写入数据到管道文件中 char wbuf[128] = ""; while(1) { printf("please enter >>>"); fgets(wbuf,sizeof(wbuf),stdin); wbuf[strlen(wbuf)-1] = 0; //将'\n'换成'\0'; //将数据写入管道文件中 write(wfd,wbuf,strlen(wbuf)); //判断退出标志 if(strcmp("quit",wbuf) == 0) { break; } } //关闭文件描述符 close(wfd); return 0; }//从有名管道读取数据
#include<myhead.h> int main(int argc, const char *argv[]) { //接收数据 //以只读形式打开管道文件 int rfd = open("./pipefile",O_RDONLY); if(rfd == -1) { perror("rfd open error"); return -1; } printf("open pipe read success\n"); //以只写的形式打开聊天记录文件 int cfd = open("./chat.txt",O_WRONLY|O_CREAT|O_TRUNC,0664); if(cfd == -1) { perror("cfd open error"); return -1; } //定义容器从管道文件中读取数据 char rbuf[128]; while(1) { //清空容器 bzero(rbuf,sizeof(rbuf)); //将管道文件中的数据写入到容器中 read(rfd,rbuf,sizeof(rbuf)); //判断退出标志 if(strcmp(rbuf,"quit") == 0) { break; } //将读数据容器输出到终端 printf("received message:%s\n",rbuf); rbuf[strlen(rbuf)] = '\n'; //将读数据容器末尾加上换成'\n' //将读数据容器写入到聊天记录文件中 write(cfd,rbuf,sizeof(rbuf)); } //关闭文件描述符 close(rfd); close(cfd); return 0; }2> 使用有名管道实现两个进程间相互通信
//创建有名管道
#include<myhead.h> int main(int argc, const char *argv[]) { //创建两个有名管道文件 //A向B发送消息的管道 if(mkfifo("./AtoB",0664) == -1) { perror("AtoB mkfifo error"); return -1; } printf("AtoB create success\n"); //B向A发送信息的管道 if(mkfifo("./BtoA",0664) == -1) { perror("BtoA mkfifo error"); return -1; } printf("BtoA create success\n"); return 0; }//A程序
#include<myhead.h> int main(int argc, const char *argv[]) { //创建子进程 pid_t pid = fork(); if(pid == 0) { //父进程,A向B发送数据,管道AtoB //以写的形式打开管道文件 int wfd = open("./AtoB",O_WRONLY); if(wfd ==-1) { perror("AtoB wfd open error"); return -1; } printf("open AtoB write success\n"); //定义容器将标准输入写入数据到管道文件中 char wbuf[128] = ""; while(1) { usleep(10); // printf("please enter >>>"); fgets(wbuf,sizeof(wbuf),stdin); wbuf[strlen(wbuf)-1] = 0; //将'\n'换成'\0' //将数据写入到管道文件AtoB中 write(wfd,wbuf,strlen(wbuf)); //判断退出标志 if(strcmp("quit",wbuf) == 0) { break; } } //关闭文件描述符 close(wfd); //退出子进程 exit(EXIT_SUCCESS); } else if(pid > 0) { //子进程,A从B读取数据,管道BtoA //以只读的形式打开管道文件BtoA int rfd = open("./BtoA",O_RDONLY); if(rfd == -1) { perror("BtoA rfd open error\n"); return -1; } printf("open BtoA read success\n"); //定义容器从管道文件中读取数据 char rbuf[128]; while(1) { //清空容器 bzero(rbuf,sizeof(rbuf)); //将管道文件中的数据写入到容器中 read(rfd,rbuf,sizeof(rbuf)); //判断退出标志 if(strcmp("quit",rbuf) == 0) { break; } //将读数据容器输出到终端 printf("received message from B:%s\n",rbuf); } //关闭文件描述符 close(rfd); } //回收子进程 waitpid(-1,NULL,WNOHANG); return 0; }//B程序
int main(int argc, const char *argv[]) { //创建子进程 pid_t pid = fork(); if(pid == 0) { //父进程,B向A发送数据,管道BtoA //以写的形式打开管道文件 int wfd = open("./BtoA",O_WRONLY); if(wfd ==-1) { perror("wfd open error"); return -1; } printf("open BtoA write success\n"); //定义容器将标准输入写入数据到管道文件中 char wbuf[128] = ""; while(1) { usleep(10); // printf("please enter >>>"); fgets(wbuf,sizeof(wbuf),stdin); wbuf[strlen(wbuf)-1] = 0; //将'\n'换成'\0' //将数据写入到管道文件BtoA中 write(wfd,wbuf,strlen(wbuf)); //判断退出标志 if(strcmp("quit",wbuf) == 0) { break; } } //关闭文件描述符 close(wfd); //退出子进程 exit(EXIT_SUCCESS); } else if(pid > 0) { //子进程,B从A读取数据,管道AtoB //以只读的形式打开管道文件AtoB int rfd = open("./AtoB",O_RDONLY); if(rfd == -1) { perror("AtoB rfd open error\n"); return -1; } printf("open AtoB read success\n"); //定义容器从管道文件中读取数据 char rbuf[128]; while(1) { //清空容器 bzero(rbuf,sizeof(rbuf)); //将管道文件中的数据写入到容器中 read(rfd,rbuf,sizeof(rbuf)); //判断退出标志 if(strcmp("quit",rbuf) == 0) { break; } //将读数据容器输出到终端 printf("received message from A:%s\n",rbuf); } //关闭文件描述符 close(rfd); } //回收子进程 waitpid(-1,NULL,WNOHANG); return 0; }