一、思维导图二、练习题1 使用有名管道实现一个进程用于给另一个进程发消息另一个进程收到消息后展示到终端上并且将消息保存到文件上一份//创建有名管道#includemyhead.h int main(int argc, const char *argv[]) { //创建一个有名管道文件 if(mkfifo(./pipefile,0664) -1) { perror(mkfifo error); return -1; } printf(create success\n); return 0; }//发送数据到有名管道#includemyhead.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; }//从有名管道读取数据#includemyhead.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 使用有名管道实现两个进程间相互通信//创建有名管道#includemyhead.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程序#includemyhead.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; }