当前位置: 首页 > news >正文

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; }

http://www.gsyq.cn/news/1399017.html

相关文章:

  • 2026年Python入门指南:从零基础到实战项目的完整学习路径
  • 别再只盯着角度了!用IMU模块(三轴加速度/陀螺仪/磁力计)玩点新花样:从平衡小车到手势识别
  • 微处理器瞬态执行安全挑战与MA-IC验证框架
  • 别再自己写PWM了!用幻尔16路舵机控制板+STM32F103,轻松搞定机械臂多舵机协同
  • 不止于刮卡:用ShaderGraph和RenderTexture在Unity里做可交互的‘图层擦除’效果(附项目源码)
  • NexusQuant:连接量化研究到实盘部署的Python开源框架
  • [智能体-93]:CNN如何在N维特征相互独立的向量中重新找回像素局部空间相邻关系,纹理、边缘、轮廓、目标形态等视觉特征?
  • AtomMQTT--使用Rust语音实现的轻量级高性能MQtt服务器
  • 从零构建本地AI代码助手:基于RAG与开源模型的实战指南
  • asc-devkit:从零开始写一个NPU算子的完整流程
  • 别只盯着Error 1:深度解析Linux内核make menuconfig背后的ncurses依赖链与编译环境搭建
  • openMES:基于国际标准构建的智能制造执行系统开源解决方案
  • 监控告警系统:及时发现并响应问题
  • STM32F103C8T6新手避坑指南:从标准库点灯到串口通信,一个工程搞定
  • 联想E14在Ubuntu18.04下搞定Realtek网卡驱动,让WiFi图标重现(附免费驱动包)
  • 告别按键!用STM32CubeMX HAL库把内部Flash当EEPROM用(附结构体存储代码)
  • 别再傻傻分不清!用FTK Imager实战对比DD和E01镜像,选对格式省下几个T硬盘
  • 避坑指南:Windows 10/11下HEG 2.15安装与Java环境配置(含路径无空格/特殊字符详解)
  • C167CR芯片片上RAM优化与μVision2配置指南
  • 无基础设施AI外呼:云服务模式下的智能对话解决方案与实践指南
  • LXMusic音源宝库:如何为你的音乐播放器注入无限能量?
  • 2026年AI写作辅助软件推荐
  • 手把手教你用Python模拟一个简易的ETH地址生成器(附代码),理解私钥碰撞到底有多难
  • 告别2G/3G!用STM32和AIR724UG Cat.1模块,手把手搭建你的第一个低成本4G物联网项目
  • 解决Animagine XL 3.1常见问题:提升生成效果的实用解决方案
  • 全光计算光纤传感:亚纳秒延迟与多参数解耦技术突破
  • ok-ww深度解析:鸣潮自动化系统从部署到高级应用全面指南
  • RTX51实时系统中的内存检测与中断安全设计
  • 单相并联型有源电力滤波器周期频率调制策略【附方案】
  • macOS窗口管理终极指南:AutoRaise提升多任务效率50%的完整教程