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

【IO】使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

目录

1、使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

2、使用有名管道实现两个进程间相互通信


1、使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

//create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建有名管道文件if(mkfifo("./linux",0664) == -1){perror("mkfifo error");return -1;}getchar();//按下回车后自动删除创建的管道文件system("rm ./linux");return 0;
}
//snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//以只写的形式打开管道文件int wfd = -1;if((wfd = open("./linux",O_WRONLY)) == -1){perror("open error");return -1;}//以读写的形式打开一个文件int destfd = -1;if((destfd = open("./dest.txt",O_RDWR|O_CREAT|O_TRUNC),0664) == -1){perror("open error");return -1;}printf("管道文件写端打开\n");//发送数据,定义一个容器char wbuf[128] = "";while(1){//输入数据printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);//将数据存入到文件中write(destfd,wbuf,sizeof(wbuf));wbuf[strlen(wbuf)-1] = 0;     //将数据最后置位'\0',成为一个字符串//将数据发送到管道中write(wfd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit") == 0){break;}}//关闭文件描述符close(wfd);return 0;
}

 

//recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//以只写的形式打开管道文件int rfd = -1;if((rfd = open("./linux",O_RDONLY)) == -1){perror("open error");return -1;}printf("管道文件读端打开\n");//接收数据,定义一个容器char rbuf[128] = "";while(1){//清空容器bzero(rbuf,sizeof(rbuf));//从管道中读取数据read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit") == 0){break;}printf("收到的数据是:%s\n",rbuf);}//关闭文件描述符close(rfd);return 0;
}

输出结果如下:可以看出已经实现在一个进程输入,另一个进程中能够输出了,同时能够保存数据到文件中

2、使用有名管道实现两个进程间相互通信

//create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建两个有名管道if(mkfifo("./linux1",0664) == -1){perror("open1 error");return -1;}if(mkfifo("./linux2",0664) == -1){perror("open2 error");return -1;}getchar();system("rm linux1");system("rm linux2");return 0;
}
//snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建父子进程pid_t pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//子进程内容//以只读的形式打开有名管道1int rfd = open("./linux2",O_RDONLY);if(rfd == -1){perror("open1 error");return -1;}//定义接收容器char rbuf[128] = "";while(1){//初始化容器bzero(rbuf,sizeof(rbuf));//获取数据read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit") == 0){break;}printf("收到的消息为:%s\n",rbuf);}close(rfd);}//父进程内容//以只读的形式打开有名管道1int wfd = open("./linux1",O_WRONLY);if(wfd == -1){perror("open1 error");return -1;}printf("管道文件已经打开\n");//发送数据char wbuf[128] = "";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf) - 1] = 0;//将数据发送到管道里write(wfd,wbuf,sizeof(wbuf));//判断数据if(strcmp(wbuf,"quit") == 0){break;}}wait(NULL);return 0;
}

//recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{//创建父子进程pid_t pid = fork();if(pid < 0){perror("fork error");return -1;}else if(pid == 0){//子进程内容int wfd = open("./linux2",O_WRONLY);if(wfd == -1){perror("open1 error");return -1;}printf("管道文件已经打开\n");//发送数据char wbuf[128] = "";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf) - 1] = 0;//将数据发送到管道里write(wfd,wbuf,sizeof(wbuf));//判断数据if(strcmp(wbuf,"quit") == 0){break;}}close(wfd);}//父进程内容//以只读的形式打开有名管道1int rfd = open("./linux1",O_RDONLY);if(rfd == -1){perror("open1 error");return -1;}//定义接收容器char rbuf[128] = "";while(1){//初始化容器bzero(rbuf,sizeof(rbuf));//获取数据read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit") == 0){break;}printf("收到的消息为:%s\n",rbuf);}close(rfd);return 0;
}

输出结果如下:可以看出已经成功实现两个进程间的通信了

3、思维导图

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新书速览|AI创意商业广告设计:Adobe Firefly + Photoshop
  • 现代前端架构介绍(第一部分):App是如何由不同的构建块构成的
  • 数据中台建设之数据汇聚与数据交换
  • Apache Pig: 高级数据处理平台
  • 【开源】嵌入式Linux(IMX6U)应用层综合项目(1)--云平台调试APP
  • 网络流算法:最大流问题
  • SparkSQL---编程模型的操作,数据加载与落地及自定义函数的使用
  • 最新全国各省市水系矢量数据(2024年更新)
  • 【教学类-73-02】20240805广口瓶(宽口瓶)02
  • 类和对象——日期类实现
  • 从一到无穷大 #32 TimeCloth,云上的快速 Point-in-Time Recovery
  • [Meachines] [Easy] shocker CGI-BIN Shell Shock + Perl权限提升
  • python rsa如何安装
  • live2d C++ sdk 分析
  • 高仲富:49岁搞AI,白天种菜卖菜,晚上学数学搞程序
  • 深入了解以太坊
  • CSS实用技巧干货
  • gcc介绍及安装
  • idea + plantuml 画流程图
  • Linux各目录及每个目录的详细介绍
  • Mybatis初体验
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Mysql数据库的条件查询语句
  • Promise面试题2实现异步串行执行
  • 当SetTimeout遇到了字符串
  • 普通函数和构造函数的区别
  • 前端设计模式
  • 用mpvue开发微信小程序
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ionic入门之数据绑定显示-1
  • linux 淘宝开源监控工具tsar
  • 阿里云重庆大学大数据训练营落地分享
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​Redis 实现计数器和限速器的
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​虚拟化系列介绍(十)
  • $.ajax()参数及用法
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4)Elastix图像配准:3D图像
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .Net Web项目创建比较不错的参考文章
  • .net 简单实现MD5
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /etc/motd and /etc/issue
  • ?php echo ?,?php echo Hello world!;?