进程间通信 - 通道
进程间通信 - 通道
什么是管道?
进程间的通信方式有五种,分别为:管道、信号量、共享内存、消息队列和套接字。
管道:本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信。即把一个进程的输出直接连接在另外一个进程的输入。
虽然实现形态上是一个特殊文件,对管道的读写可以使用普通的read(),write()函数,但管道不属于任何文件系统(管道本身并不占用磁盘或者其他外部存储的空间)。
在Linux的实现上,它占用的是内存空间,只存在于内存中。所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。即管道本质上是内核的一块缓存。
管道分为有名管道和无名管道两种,它们的区别是:
- 无名管道:又称为匿名管道(Anonymous Pipe),只能在亲缘进程(是指有同一个祖先如父子进程、兄弟进程)之间进行通信。
- 有名管道:又称为命名管道(Named Pipe),可以在任意两个进程之间进行通信。
管道通信模式
通信模式分为:
- 单工:数据只在一个方向上传输,不能实现双方通信
- 半双工(切换的单工):允许数据在两个方向上传输,但是同一时间数据只能在同一个方向上传输
- 全双工:允许数据在两个方向上同时传输
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道,
管道的特点
- 管道是半双工的
- 管道提供流式服务,字节流通信,没有消息边界,多个进程同时发送的字节流混在一起,则无法分辨消息,所有管道一般用于两个进程之间通信。
- 管道的内容读完后不会保存
- 一般而言,进程退出,管道释放,所以管道的生命周期跟随进程
- 一般而言,内核会对管道操作进行同步与互斥
- 匿名管道一般用于亲缘进程间通信,命名管道一般用于两个无关联进程间通信
匿名通道(PIPE)
是一种亲缘进程间的通信方法。匿名管道存在于kernel(内核)中,A,B必须具有亲缘关系进程。同一时刻,只能有一个写端或一个读端。
父子进程间,只要是**fork()**出来的,就会完美复制父进程的数据。如果在fork0)之前创建管道,并获取管道的操作接口,子进程就能使用管道。
命名管道(FIFO)
**命名管道(Named Pipe)**是一种独立进程之间通信的机制,用于在无关的进程之间进行数据传输。
与匿名管道不同,命名管道不需要亲缘关系的进程之间,也不需要共享同一终端。任意进程可以通过打开命名管道的读取端和写入端来与其进行通信。
命名管道通过在文件系统中创建一个特殊的文件来实现通信。这个特殊的文件被称为FIFO(First-inFirst-out)或命名管道。
命名管道通信的原理:
- 和匿名管道一样,想让双方通信,必须先让双方看到同一份资源!它和匿名管道本质是一样的,只是看到资源的方式不同。
- 匿名管道是通过父子进程继承来看到同一份资源的,也叫做管道文件,这个文件是纯内存级的,所以没有名字,叫做匿名管道。
- 而命名管道是在磁盘上有一个特殊的文件,这个文件可以被打开,但是打开后不会将内存中的数据刷新到磁盘。在磁盘上就有了路径,而路径是唯一的,所以双方就可以通过文件的路径 来看到同一份资源,即管道文件。
命名管道的特点:
- 命名管道可以使互不相关的两个独立进程实现彼此通信
- 命名管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两进程就可以把它当作普通文件进行读写,使用非常方便。
- FIFO严格遵循先进先出原则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。命名管道不支持如Iseek0)等文件的定位操作。
- 命名管道依然在内核态内存中
- 命名管道在文件系统中有节点(即在文件系统中可以找到)
- 命名管道严格遵循先进先出原则
- 命名管道不能使用文件重定位的函数lseek()
- 命名管道可以用在亲缘和非亲缘进程间(一般用于非亲缘进程间通信)
管道命名
在Linux shell中执行命令,经常会将上一个命令的输出作为下一个命令的输入,由多个命令配合完成一件事情。而这就是通过管道来实现的。|这个竖线就是管道符号。
Is-llgrep string //grep是抓取指令
●1s命令(其实也是一个进程)会把当前目录中的文件都列出来但它不会直接输出,而是把要输出到屏幕上的数据通过管道输出到grep这个进程中,作为grep这个进程的输入;
●然后这个进程对输入的信息进行筛选(grep的作用),把存在string的信息的字符串(以行为单位)打印在屏幕上。
相关文章:

进程间通信 - 通道
进程间通信 - 通道 什么是管道? 进程间的通信方式有五种,分别为:管道、信号量、共享内存、消息队列和套接字。 管道:本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于…...

华为数通HCIA系列第5次考试-【2024-46周-周一】
文章目录 1、子网掩码有什么作用,和IP地址是什么关系,利用子网掩码可以获取哪些信息?2、已知一个IP地址是192.168.1.1,子网掩码是255.255.255.0,求其网络地址3、已知某主机的IP地址是192.168.100.200,子网掩…...
【Linux】如何通过终端命令查看当前可用网络 WIFI + 设置已配置网络的连接优先级 + 连接/断连网络
【Linux】通过命令行,查看当前可用网络 WIFI 设置已配置网络的连接优先级 连接网络 列出所有可连接网络 nmcli device wifi list这个命令会列出所有可连接 wifi,*表示当前连接。 IN-USE BSSID SSID MODE CHAN …...

华为路由策略配置
一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…...
Debezium日常分享系列之:异步 Debezium 嵌入式引擎
Debezium日常分享系列之:异步 Debezium 嵌入式引擎 动机目标非目标保留Kafka Connect模型计划的更改线程池并行运行源任务存储偏移量并发处理CDC事件禁用CDC事件的完全排序自定义记录处理器并行处理记录的选项存储偏移量引擎状态和生命周期防止资源泄漏异常处理退出…...
leetcode206. Reverse Linked List
Given the head of a singly linked list, reverse the list, and return the reversed list. 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 思路一:双指针 class Solu…...

【MATLAB源码-第291期】基于matlab的AMI编码解码系统仿真,输出各个节点波形。
操作环境: MATLAB 2022a 1、算法描述 AMI(Alternate Mark Inversion,交替极性反转)是一种广泛使用的编码方法,尤其是在通信系统中,用于传输二进制数据。AMI编码的特点是在传输过程中,对于0信…...
springboot苍穹外卖实战:十一:复盘总结
近期在整理草稿区,故放出此贴。 server模块需要导入对common模块的依赖 <dependency><groupId>org.example</groupId><artifactId>sky-common</artifactId><version>1.0-SNAPSHOT</version></dependency>我现在有个…...

基于Python的药房管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
chat2db数据库图形化工具
数据库图形化工具 DataGrip:由 JetBrains 公司开发,是开发者中广为人知的数据库管理工具,功能强大且支持多种数据库。DBeaver:一款开源的数据库管理工具,虽然相对 DataGrip 知名度稍低,但在开发者社区中也…...

弱口令整改方案:借助双因子认证加强账号密码安全
弱口令整改方案可借助宁盾 2FA双因子身份认证来解决。双因子认证(也称双因素身份认证)是一种安全认证机制,通过结合两个及以上不同的身份验证因子,提高企业用户在办公、研发、生产、运维场景下的的账号密码安全性。它可以有效防止…...
动态代理的优势是什么?
在数据采集的世界里,效率和稳定性是衡量代理IP服务优劣的关键指标。动态代理,作为一种高效的网络工具,正逐渐成为企业和开发者的首选。今天,我们就来聊聊动态代理的优势,以及它如何成为数据采集的高效之选。 动态代理…...
将大型语言模型(如GPT-4)微调用于文本续写任务
要将大型语言模型(如GPT-4)微调用于文本续写任务,构造高质量的训练数据至关重要。以下是如何构造训练数据的详细步骤: 1. 数据收集: 多样性: 收集多种类型的文本,包括小说、新闻、论文、博客等…...
引入了JUnit框架 却报错找不到:java.lang.ClassNotFoundException
完整报错如下: Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID junit-jupiter failed to discover tests at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrc…...
深度学习:tensor的定义与维度
tensor的定义与维度 Tensor的定义与维度 Tensor是一个多维数组,用于在一般化的n维空间中表示数据和操作。在深度学习框架中,如TensorFlow或PyTorch,Tensor是基础数据结构,用来存储输入、输出、权重等信息。下面是Tensor不同维度…...

基于Python的膳食健康系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api
前提: 从前面的学习我们知道 AVFrame中是最原始的 视频数据,这一节开始我们需要将这个最原始的视频数据 压缩成 AVPacket数据, 我们前面,将YUV数据或者 RGBA 数据装进入了 AVFrame里面,并且在SDL中显示。 也就是说&…...
算法——移除元素(leetcode27)
对于移除元素这道题来讲,我首先想到的还是双指针,根据题目要求我们需要在给定的一组数组中找出与目标值不同的元素数量并且将与目标值不同的元素全部移至数组左边右边则不需关注数组元素的大小,我们利用两个指针一个指向数组首部位置(左指针&…...
『OpenCV-Python』安装以及图像的读取、显示、保存
点赞 + 关注 + 收藏 = 学会了 OpenCV 是一个开源的计算机视觉库,广泛应用于图像处理、机器学习和实时计算机视觉应用。比如图像和视频的滤镜和降噪、物体检测、人脸识别、证件号识别、车牌识别等应用。当然,也有其他工具可以对这些领域做支持,但本专栏是介绍 OpenCV 的,所…...

python开发桌面应用(跨平台) 全流程
前言 之前开发一些软件,亚马逊商品分析相关软件,但是基本上是通过程序猿控制台命令启动,同时在启动之前,还要进行程序依赖包,这对于非开发人员而言,简直是一种灾难, 为了让软件对于小白更加易用, 打算将其封装成应用程序(跨平台), 下面带大家一起完成python开发桌面应用的三步…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...