管道?是浇筑水泥的管道? ^v^‘

文章目录

  • 序言
  • 目的
  • 进程间通信的理解
  • 进程间通信的发展历史
  • 管道创建
  • 验证管道的大小
  • 管道的4种情况
  • 管道的5种特征

序言

在这里插入图片描述
通过该命令计算了在当前路径下一共有多少个文件夹的任务

进程虽然有独立性,但是进程并不孤僻,他们之间也会相互进行协作共同完成一件事
这个前提是他们之间的信息能传递(进程间通信)

目的

数据传输:进程将数据发送给另一个进程
资源共享:进程间共享同样的资源
通知事件:一个进程向另一个或一组进程发送信息,通知他们完成了某事(如子进程终止通知父进程)
进程控制:有些进程希望完全控制另一个进程(如Debug进程),此时控制进程就希望能够
拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

进程间通信的理解

例如

爸妈吵架,分房睡觉了,互相不说话,相互独立.但是又要交流,所以我成为了他们交流的枢纽
爸妈就是两个进程, 我就是OS
我妈让我叫我爸吃饭
我爸说不吃顺便告诉我妈 就相当于进程间通信
进程间通信本质:让不同的进程看到同一份资源(比如爸妈吵架交流,我还没回家,他们就不相往来)
这一份资源,不能由俩进程单独提供,但是可以申请(比如,我爸可以叫我回来)
通常由OS提供

进程间通信的发展历史

一个程序被加载成进程就有了缓冲区,所以早期设置进程间通信的时候就想着复用以前的代码,所以有了进程间通信的几种方式,其中一种就是管道,还有

system V IPC, POSIX IPC
system V—进程间本地通信
POSIX – 跨网络,实现跨主机通信

管道创建

在这里插入图片描述

在这里插入图片描述在这一步,父进程创建子进程后,子进程的files_struct也有内容指向管道文件

在这里插入图片描述然后父进程关闭读端,子进程关闭写端
这样就创建了一个管道
那么,具体情况是怎样的呢?

当一个进程被创建时:
在这里插入图片描述当创建子进程后,文件描述符表也会浅拷贝给子进程
而文件部分不会拷贝给子进程
所以父子进程的打印打印信息都能在屏幕上显示

这个文件页缓冲区:

就是管道
父进程向子进程发送消息
管道文件是纯内存的文件
这个文件不需要向磁盘写入,也不需要路径和文件名
所以叫做匿名管道

在这里插入图片描述
如何让不同的进程看到同一份资源文件管道?
创建子进程时,复用同一套代码,让父子进程读到同一个文件

在这里插入图片描述总结上图就是:
在这里插入图片描述
代码创建管道:

#include<iostream>
#include<unistd.h>
#include<cassert>
#include<sys/types.h>
#include<sys/wait.h>
#include<cstring>
#define MAX 1024using namespace std;
int main()
{//第一步,建立管道int pipefd[2] = {0};int n = pipe(pipefd);assert(n == 0);//debug下才存在,在release模式下这条语句会不存在,这样导致的问题是,n在后续的release中会未被使用(void)n;//这样会导致一些编译器的报错,所以加此语句的目的是防止这样的报错发生cout<<"pipe[0]:"<<pipefd[0]<<",pipe[1]"<<pipefd[1]<<endl;//第二步,创建子进程pid_t id = fork();if(id<0){perror("fork");return 1;}//第三步,形成单向通信的管道,子写,父读//父子进程关闭不需要的fd,即可形成单行通信的管道//形成单行管道后,可以不用手动关闭,因为进程退出后会自动释放当前进程对应的文件描述符表//所以手动关闭不关闭看情况,这边是不需要手动关闭if(id == 0){//child 子进程写入close(pipefd[0]);//向管道写入信息,只有写入,没有打印int cnt = 0;while(true){// char c = 'a';// write(pipefd[1],&c,1);// cout<<"write  :" << ++cnt <<endl;cnt++;char message[MAX];snprintf(message,sizeof(message),"i'm child,my pid is %d , cnt %d",getpid(),cnt);//snprintf,向指定的对象中写入,写入多少个字节,写入什么内容...write(pipefd[1],message,strlen(message));sleep(1);if(cnt > 3) break;}//close(pipefd[1]);cout << "child close w point" << endl;exit(0);}//father,读取close(pipefd[1]);//用来从管道当中读取char buf[MAX];while(true){ssize_t n = read(pipefd[0],buf,sizeof(buf)-1);//减一的目的是万一缓冲区读满了,可以留出空位置来给\0if(n > 0)//读取成功,切返回读取到的字符串的长度{buf[n] = 0;//当做字符串cout << "my pid:"<<getpid()<<",child says:" << buf << "to me!" << endl;//向屏幕打印信息}else if(n == 0){cout << "child is quit, me too!" << endl;break;}sleep(1);cout << "father return val(n): " << n << endl;break;}cout<<"read is closed"<<endl;close(pipefd[0]);sleep(5);int status = 0;pid_t rid = waitpid(id,&status,0);if(rid==id){cout<<"wait successful,child exit sig: "<<(status&0x7F)<<endl;//低7为该进程退出时收到的信号,次低8位退出码}return 0;
}

问题:

1.父进程创建子进程不是数据共享的吗?不是能直接访问吗?为什么要用这样的方式呢?
是能数据共享,能访问,但是不能访问动态的数据,管道可以实现动态数据的父子进程的相互访问,而不用管道只能访问静态的数据
2.利用管道还能实现子进程向父进程数据的写入,这时就不仅限于单独的父进程向子进程的写入数据

运行演示:
在这里插入图片描述

验证管道的大小

验证管道的大小:
在这里插入图片描述

结果:
在这里插入图片描述

进行换算:管道的大小为64字节
在这里插入图片描述

ulimit -a查看管道大小open files指可以打开的文件的个数

在这里插入图片描述

管道大小为8*512/1024==4,并不是64,这边的管道大小并不是实际大小

管道的4种情况

1.如果管道中没有数据了,读段必须进行等待,直到有数据为止
2.管道也有大小,写端不会一直写下去,写满后会阻塞等待,直到等到读端读取数据后(管道有空间),写端才会再继续写入数据

1,2两点对应管道的同步机制(管道特征第二特征)

3.写端关闭,读端一直读,读端会读到read的返回值为0表示读到文件的结尾
在这里插入图片描述
在这里插入图片描述
结果演示:
在这里插入图片描述

4.读端关闭,写端一直写,写入没有意义,OS会杀掉写端进程,进程异常(向目标进程发送13号信号),终止目标进程

在这里插入图片描述在这里插入图片描述

管道的5种特征

1.匿名管道
在一个进程体系当中,爷孙,兄弟之间都能通过管道来进行通信,常用于父子
2.匿名管道,默认给读写端提供同步机制 这个同步机制体现在下述现象
将代码进行细节处修改

在这里插入图片描述
在这里插入图片描述
读了一部分再写

3.面向字节流-----了解现象即可
读取的时候是按照缓冲区的大小进行读取的,能读多少读多少

4.管道的生命周期是随进程的周期的
当不显示关闭文件,进程退出会有什么影响?
在这里插入图片描述
在这里插入图片描述

可以看到,管道的写端是被关闭的,可是管道也是文件
所以,文件描述符表全称进程文件描述符表是有原因
管道会跟随进程一起关闭

5.管道是单向通信的,半双工通信的一种特殊情况
半双工:

任何时候一个人说,一个人在听

全双工:

你说的时候对方也再说,你说的时候对方还在听,对方也是如此
未来的网络通信都是全双工

实现命令行管道
在这里插入图片描述

像这样的怎么实现呢?

在这里插入图片描述
具体代码,下篇见详情!!

有所帮助希望三连,谢谢支持~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】Docker 实践(五):搭建私有镜像 Harbor

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

如何在Mac上恢复格式化硬盘的数据?

“嗨&#xff0c;我格式化了我的一个Mac硬盘&#xff0c;而没有使用Time Machine备份数据。这个硬盘被未知病毒感染了&#xff0c;所以我把它格式化为出厂设置。但是&#xff0c;我忘了备份我的文件。现在&#xff0c;我想恢复格式化的硬盘驱动器并恢复我的文档&#xff0c;您能…

AJ-Report开源数据大屏 verification;swagger-ui RCE漏洞复现

0x01 产品简介 AJ-Report是一个完全开源的BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。多数据源支持,内置mysql、elasticsearch、kudu等多种驱动,支持自定义数据集省去数据接口开发,支持17+种大屏组件,不会开发,照着设计稿也可以制作大屏。三…

SVM单类异常值检测

SVM是一种广泛使用的分类器&#xff0c;通常用于二分类或多分类问题。然而&#xff0c;在异常点检测的场景中&#xff0c;我们通常会将数据视为一个类别&#xff08;即正常数据点&#xff09;&#xff0c;并尝试找到那些与正常数据点显著不同的点&#xff08;即异常点&#xff…

Vue Vant 移动端如何禁止手机调起自带的输入键盘

前言 前不久在公司用Vue2开发了一个手机充值项目&#xff0c;键盘组件用的vant2的NumberKeyboard 数字键盘组件&#xff1b;上线后在IOS端只有一个vant数字键盘组件&#xff0c;但到了Android端&#xff0c;输入框一获取焦点不仅vant数字键盘弹出&#xff0c;连手机自带的键盘…

华为平板手机如何清理应用市场的存储空间

如何清理应用市场的存储空间 适用产品&#xff1a; 手机&#xff0c;平板 适用版本&#xff1a;不涉及系统版本 如果您的应用市场显示应用的数据较大&#xff0c;可能是下载的安装包没有安装成功&#xff0c;导致安装包未自动删除。&#xff08;可参考&#xff1a;应用市场下…

117篇 | 3D Gaussian Splatting论文

本论文集划分为4个部分&#xff1a;综述&基础&#xff08;14篇&#xff09;、NeRF在AIGC&#xff08;54篇&#xff09;、NeRF在SLAM&#xff08;自动驾驶&#xff09;&#xff08;25篇&#xff09;、NeRF之场景建模&#xff08;25篇&#xff09; https://t.zsxq.com/3ATyE…

【UnityRPG游戏制作】NPC交互逻辑、动玩法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

R语言数据探索与分析-运用时间序列预测模型对成都市API进行预测分析

一、研究背景 “绿水青山就是金山银山&#xff0c;要让绿水青山变成金山银山”让人们深刻的意识到环境的重要性。与此同时&#xff0c;由于现代生活水平的不断提高&#xff0c;所带来的环境污染也不断增多&#xff0c;空气以及环境的污染带来了越来越多的疾病&#xff0c;深刻…

vue2项目webpack3.x打包文件分割优化加载

vue2项目webpack3.x打包文件分割优化加载 0. 项目目录和依赖信息1. 开启 gzip&#xff08;建议&#xff09;2. vue2项目配置懒加载&#xff08;建议&#xff09;3. 拆分 vendor 包注意&#xff1a;webpack3使用CommonsChunkPlugin实现 本文使用 3 种方案进行叠加优化 优先级按以…

AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

39 死锁

目录 1.死锁 2.线程同步 3.条件变量 4.案例 死锁 概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 四个必要条件 互斥条件&#xff1a;一个资源每次只能被一个执行流使用 请求…

如何快速搭建nginx服务

华子目录 nginx简介概念特点nginx框架nginx关键工作机制 nginx正向代理功能nginx反向代理功能nginx反向代理的工作流程代理本质 nginx负载均衡部署nginx常用命令systemctl系列nginx自带命令 nginx配置文件主配置文件/etc/nginx/nginx.conf内容结构模块分析配置分析注意示例 ngi…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口

电脑找不到msvcp140.dll如何修复?msvcp140.dll丢失的多种解决方法分享

在日常电脑操作过程中&#xff0c;用户可能会遇到一个令人困扰的问题&#xff0c;即屏幕上突然弹出一条错误提示&#xff1a;“由于找不到msvcp140.dll&#xff0c;无法继续执行代码”。这一情况往往导致应用程序无法正常启动或运行&#xff0c;给工作和娱乐带来不便。不过&…

ps科研常用操作,制作模式图 扣取想要的内容元素photoshop

复制想要copy的图片&#xff0c; 打开ps---file-----new &#xff0c;ctrolv粘贴图片进入ps 选择魔棒工具&#xff0c;点击想要去除的白色区域 然后&#xff0c;cotrol shift i&#xff0c;反选&#xff0c; ctrol shiftj复制&#xff0c;复制成功之后&#xff0c;一定要改…

Vitis HLS 学习笔记--HLS眼中的完美循环嵌套

目录 1. 简介 2. 示例 2.1 不完美循环 2.2 完美循环 2.3 HLS 眼中的循环 3. 总结 1. 简介 在处理嵌套循环时&#xff08;HDL或HLS工具中&#xff09;&#xff0c;优化循环结构对于实现最佳性能至关重要。嵌套循环的性能优化直接影响着计算的时延和资源利用率。创建完美嵌…

Stable Diffusion学习线路,提示词及资源分享

1. 提示词的基础概念 提示词分为正面提示词&#xff08;Prompts&#xff09;和反面提示词&#xff08;Negative Prompts&#xff09;。正面提示词代表你希望画面中出现的内容&#xff0c;而反面提示词代表你不希望画面中出现的内容。提示词通常是以英文书写&#xff0c;最小单…

nginx--压缩https证书favicon.iconginx隐藏版本号 去掉nginxopenSSL

压缩功能 简介 Nginx⽀持对指定类型的⽂件进行压缩然后再传输给客户端&#xff0c;而且压缩还可以设置压缩比例&#xff0c;压缩后的文件大小将比源文件显著变小&#xff0c;这样有助于降低出口带宽的利用率&#xff0c;降低企业的IT支出&#xff0c;不过会占用相应的CPU资源…

逻辑回归实战 -- 是否通过考试

http://链接: https://pan.baidu.com/s/1-uy-69rkc4WjMpPj6iRDDw 提取码: e69y 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 数据集下载链接 这是个二分类问题&#xff0c;通过x1,x2两个指标得出是否通过考试的结论。 逻辑回归的激活函数是sigmoid函数&…