当前位置: 首页 > 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.jsqmd.com/news/894453/

相关文章:

  • 2026年Python入门指南:从零基础到实战项目的完整学习路径
  • 别再只会用find了!Linux文件搜索三剑客locate/which/whereis保姆级对比指南
  • 调参不再玄学:深入PX4固定翼姿态控制器,搞懂空速缩放与混控器配置
  • 深度学习情感分析:加权特征融合提升模型鲁棒性与可解释性
  • 别再手动算脉冲了!用STM32HAL库的TIM编码器模式,5分钟搞定AB编码器测速定位
  • 应用性能监控(APM):全方位掌握应用状态
  • 别再自己写PWM了!用幻尔16路舵机控制板+STM32F103,轻松搞定机械臂多舵机协同
  • 终极围棋AI训练指南:3步快速提升棋力的免费解决方案 [特殊字符]
  • Mac电脑实用工具
  • IO 8
  • 终极指南:如何用DeepCAD实现AI驱动的智能CAD建模革命?
  • everfu/hexo-theme-solitude主题本地搜索功能:基于hexo-generator-search的配置
  • 2026年知名的硬质真空镀膜设备/光学真空镀膜设备/PVD镀膜设备厂家选择推荐 - 行业平台推荐
  • 避坑指南:STM32驱动OV7670带FIFO模块,SPI屏显示图像模糊、帧率低的5个常见问题与解决方法
  • [智能体-93]:CNN如何在N维特征相互独立的向量中重新找回像素局部空间相邻关系,纹理、边缘、轮廓、目标形态等视觉特征?
  • AtomMQTT--使用Rust语音实现的轻量级高性能MQtt服务器
  • 告别静态模板:用AI指令动态生成项目脚手架
  • 数据库性能优化实战:索引与查询调优
  • 2026年口碑好的大连工业采暖/大连智慧供热采暖爆款推荐 - 行业平台推荐
  • 告别手动配置:用MCUXpresso Config Tools为i.MX RT1061快速迁移串口外设(以UART1改UART4为例)
  • Debian 10上编译pciutils-3.5.2踩坑记:解决-fvisibility=hidden导致的链接错误
  • 别再让时钟白跑了!手把手教你用Clock Gating给芯片省电(附VCS/DC实战命令)
  • 别只盯着Error 1:深度解析Linux内核make menuconfig背后的ncurses依赖链与编译环境搭建
  • 2026年热门的大连智慧供热采暖/大连别墅采暖优质选择 - 品牌宣传支持者
  • 2026年靠谱的大连空气能取暖工程/大连公司空气能供暖/大连空气能取暖售后/大连学校空气能供暖工程服务商 - 行业平台推荐
  • 别再只调库了!手把手教你为I.MX6ULL写一个DS18B20的Linux字符设备驱动
  • asc-devkit:从零开始写一个NPU算子的完整流程
  • TPU里的脉动阵列,为啥比GPU的CUDA核更省电?聊聊数据复用与能效比
  • Claude Code如何重塑自由职业开发者工作流:从编码到架构的效能跃迁
  • ntp服务器配置