news 2026/5/27 4:16:10

IO 7

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 4:06:37

G4-MeroMero-31B模型架构深度解析:从SFT到Merge的完整训练流程

G4-MeroMero-31B模型架构深度解析&#xff1a;从SFT到Merge的完整训练流程 【免费下载链接】G4-MeroMero-31B 项目地址: https://ai.gitcode.com/hf_mirrors/zerofata/G4-MeroMero-31B G4-MeroMero-31B是一个基于Google Gemma 4 31B模型进行微调的大型语言模型&#xf…

作者头像 李华
网站建设 2026/5/27 4:06:11

三步搞定iPhone抢购难题:Apple Store预约助手实战指南

三步搞定iPhone抢购难题&#xff1a;Apple Store预约助手实战指南 【免费下载链接】apple-store-helper Apple Store iPhone预约助手 项目地址: https://gitcode.com/gh_mirrors/ap/apple-store-helper 还在为抢不到最新款iPhone而烦恼吗&#xff1f;每次手动刷新Apple官…

作者头像 李华
网站建设 2026/5/27 4:05:43

React AJAX:深入浅出

React AJAX&#xff1a;深入浅出 引言 随着互联网的快速发展&#xff0c;前端技术的应用越来越广泛。React 作为当今最流行的前端框架之一&#xff0c;其强大的数据处理能力使得 AJAX 在 React 中的应用变得尤为重要。本文将深入浅出地介绍 React AJAX 的概念、原理和应用&…

作者头像 李华
网站建设 2026/5/27 4:02:16

Python多参数函数通关秘籍:手把手教你搞定ICode五级训练场所有关卡

Python多参数函数通关秘籍&#xff1a;手把手教你搞定ICode五级训练场所有关卡在ICode国际青少年编程竞赛的Python五级训练场中&#xff0c;多参数函数的设计与应用是许多参赛者面临的"拦路虎"。面对屏幕上密密麻麻的参数和嵌套逻辑&#xff0c;不少选手会感到无从下…

作者头像 李华