进程间通信方式--管道

每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。

 

管道

管道的linux命令:ps auxf | grep mysql

 上面命令行里面的竖线就是一个管道,它的功能是将前一个命令(ps auxf)的输出,作为后一个命令(grep mysql)的输入,从这功能描述,可以看出管道传输数据是单向的,如果想相互通信,我们需要创建两个管道才行。

管道可以分为匿名管道和命名管道。

上述,‘ | ’就是一个匿名管道。命名管道也被叫做FIFO,因为数据是先进先出的传输方式。

在使用命名管道前,先需要通过mkfifo命令来创建,并且指定管道名字:

mkfifo myPipe

myPipe就是这个管道的名称 ,基于Linux一切皆文件的理念,所以管道也是以文件的方式存在。

接下来,可以往myPipe这个管道写入数据:

$ echo "hello" > myPipe  // 将数据写进管道
                         // 停住了 ...

操作了之后,你会发现命令执行后就停在这了,这是因为管道里的内容没有被读取,只有当管道里的数据被读完后,命令才可以正常退出。

于是,执行另外一个命令来读取这个管道里的数据:

$ cat < myPipe  // 读取管道里的数据
hello

可以看到管道里的内容被读取出来了,并打印在了终端上,另外一方面,echo那个命令也正常退出了。

我们可以看出,管道这种通信方式效率低,不适合进程间频繁地交换数据。

当然,它的好处,自然就是简单,同时我们也很容易得知管道里的数据已经被另一个进程读取了。

管道创建的原理是什么?

匿名管道的创建,需要通过这个系统调用:

int pipe(int fd[2])

 这里表示创建一个匿名管道,并返回了两个描述符,一个是管道的读取端描述符fd[0],另一个是管道的写入端描述符fd[1]。注意,这个匿名管道是特殊的文件,只存在于内存,不存在于文件系统中。

 其实,所谓管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。

怎么样才能使得管道是跨过两个进程的呢?

可以使用fork创建子进程,创建的子进程会复制父进程中的文件描述符,这样就做到了两个进程各有两个fd[0]和fd[1],两个进程就可以通过各自的fd写入和读取同一个管道文件实现跨进程通信了。

管道只能一端写入,另一端读出,所以上面这种模式容易造成混乱,因为父进程和子进程都可以同时写入,也都可以读出。那么,为了避免这种情况,通常的做法是:

(1)父进程关闭读取的fd[0],只保留写入的fd[1];

(2)子进程关闭写入的fd[1],只保留读取的fd[0]。

所以说如果需要双向通信,则应该创建两个管道。

到这里,我们仅仅解析了使用管道进行父进程与子进程之间的通信,但是在我们shell里面并不是这样的。

在shell里面执行 A | B 命令的时候,A进程和B进程都是shell创建出来的子进程,A和B之间不存在父子关系,它俩的父进程都是shell。

 所以说,在shell里面通过 | 匿名管道将多个命令连接在一起,实际上也就是创建了多个子进程,那么在我们编写shell脚本时,能使用一个管道搞定的事,就不要多用一个管道,这样可以减少创建子进程的系统开销。

总结

对于匿名管道也就是无名管道,它的通信范围是存在于父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过fork来复制父进程fd文件描述符,来达到通信的目的。

对于命名管道也就是有名管道,它可以在不相关的进程间通信。因为有名管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。

不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据自然也是从内核中读取,同时通信数据都遵循先进先出原则。

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

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

相关文章

新手vue学习问题汇总(自用)(长期更新)

1.export default export default 是 ES6 模块语法&#xff0c;用于导出模块的默认成员。在 Vue.js 中&#xff0c;通常用来导出一个组件对象&#xff0c;使其可以在其他文件中被导入并使用。 2.props props 是组件接收外部数据的方式。父组件可以通过向子组件传递 props 来…

紫杉醇生物合成机制研究进展-文献精读35

紫杉醇生物合成机制研究进展 摘要 紫杉醇是目前已发现的最具抗癌活性的天然广谱抗癌药物之一&#xff0c;其生产方式主要依赖于从珍稀植物红豆杉中进行分离提取以及化学半合成&#xff0c;因其含量稀少&#xff0c;生产能力受到严重的限制。随着红豆杉基因组的全解析和合成生…

如何在 Windows 上安装并配置 VNC 远程连接树莓派,并结合Cpolar实现公网远程访问

目录 ⛳️推荐 前言 1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS 2. Windows安装VNC远程树莓派 3. 使用VNC Viewer公网远程访问树莓派 3.1 安装Cpolar步骤 3.2 配置固定的公网地址 3.3 VNC远程连接测试 4. 固定远程连接公网地址 4.1 固定TCP地址测试 ⛳️推荐…

内网隧道学习笔记

1.基础&#xff1a; 一、端口转发和端口映射 1.端口转发是把一个端口的流量转发到另一个端口 2.端口映射是把一个端口映射到另一个端口上 二、http代理和socks代理 1.http带那里用http协议、主要工作在应用层&#xff0c;主要用来代理浏览网页。 2.socks代理用的是socks协议、…

编码器如何在stm32上使用?

编码器如何在stm32上使用 文章目录 编码器如何在stm32上使用1. 编码器是什么&#xff1f;2. 如何在stm32上使用编码器1. 编码器的基本原理2. STM32上的实现3. 代码实现 1. 编码器是什么&#xff1f; 编码器是一种传感器或设备&#xff0c;用于测量位置、角度或速度&#xff0c…

坐标系转换公式

坐标系转换2种情况&#xff1a; 一、XOY坐标系不动&#xff0c;点P(x, y) 沿顺时针方向旋转 θ \thetaθ&#xff0c;得在XOY坐标系的坐标为P(x′, y′) 设某点与原点连线和X轴夹角为b度&#xff0c;以原点为圆心&#xff0c;逆时针转过a度 , 原点与该点连线长度为R, [x,y]为…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(上)

1.范围 本部分规定了DLMS/COSEM客户机和服务器的DLMS/COSEM应用层的结构、服务和协议。同时,定义规则规定DLMS/COSEM通信配置。 它定义了用于建立和释放应用程序连接的服务,以及用于访问GB/T17215.662中使用逻辑名称(LN)或短名称(SN)引用定义的COSEM接口对象的方法和属性…

先用先发!小样本故障诊断新思路!Transformer-SVM组合模型多特征分类预测/故障诊断(Matlab)

先用先发&#xff01;小样本故障诊断新思路&#xff01;Transformer-SVM组合模型多特征分类预测/故障诊断&#xff08;Matlab&#xff09; 目录 先用先发&#xff01;小样本故障诊断新思路&#xff01;Transformer-SVM组合模型多特征分类预测/故障诊断&#xff08;Matlab&#…

关于 OSPF LSA 序列号范围 0x80000001-0x7FFFFFFF 释疑正本清源

注&#xff1a;机翻&#xff0c;未校对。 正本&#xff1a;RFC 2328 OSPF Version 2 中相关解释 April 1998 12.1.6. LS sequence number 12.1.6. 序列号 The sequence number field is a signed 32-bit integer. It is used to detect old and duplicate LSAs. The space …

找工作准备刷题Day14 回溯算法 (卡尔41期训练营 7.29)

第一题&#xff1a;Leetcode376. 摆动序列 题目描述 解题思路 使用两个变量&#xff1a;preDiff 和 curDiff&#xff0c;分别记录 前一次相邻元素差值和 此处相邻元素值之差&#xff0c;只有当preDiff 和 curDiff 符号不同&#xff0c;摆动序列长度加一。 初始&#xff1a;长…

1.4、存储系统

目录 存储器的层次结构外存&#xff08;辅存&#xff09;内存CPU的寄存器Cache总结举例局部性原理 练习题 高速缓存Cache总结举例总结 练习题 Cache的地址映像方法直接相联映像全相联映像组相联映像练习题 Cache替换算法Cache页面淘汰算法Cache的读写过程练习题 磁盘总结固态硬…

dpdk 响应icmp请求(Echo or Echo Reply Message)

注&#xff1a;对于"Echo or Echo Reply Message"类型的icmp报文&#xff0c;响应报文的Identiy和Sequence Number的值与请求报文的这两个字段的值要相同。 Identifier&#xff08;标识符&#xff09;字段通常由发送方设置&#xff0c;并被用于将ICMP请求与相应的回复…

python采集阿里巴巴历年员工人数统计报告

数据为2012到2022财年阿里巴巴每年的全职员工数量。截止2022年3月31日&#xff0c;阿里巴巴共有全职员工254941人&#xff0c;比上年增长3479人。 数据来源于阿里巴巴20-F和F-1文件 按阿里巴巴财政年度进行统计&#xff0c;阿里巴巴财年结束日期为每年3月31日 为全职员工人数 阿…

好用的开源免费录屏工具|OBS录屏参数设置|OBS录屏参数优化|录屏工具科普|OBS如何设置录屏才能不模糊

背景/引言 我的需求 相信这也是大多数用户的录屏需求。 选择一款开源免费的PC录屏软件&#xff08;开源意味着可能需要了解一些参数概念以及如何设置&#xff0c;设置多少的问题&#xff0c;灵活性带来入门门槛的问题&#xff0c;但是相应的也会掌握一些视频相关的知识&…

WireShark 更改界面主题

背景 Windows 是黑色主题 安装 WireShark 后&#xff0c;WireShark 界面也是黑色主题 预期 想要将 WireShark 界面更改为白色主题 操作 启动 wireshark 时添加 -platform windows:darkmode0 参数 <Wireshark.exe 路径> -platform windows:darkmode0 例&#xff1a;…

echarts所遇到的问题,个人记录

TreeMap 矩形树图&#xff0c;label设置富文本之后&#xff0c;无法垂直居中 font-size 支持rem&#xff0c;其余不支持 font-size 支持 rem&#xff0c;但是其余的属性如height&#xff0c;width等不支持 echarts-for-react 绑定事件&#xff0c;会覆盖实例上绑定的 当给cha…

[C++探索]初始化列表,static成员,友元函数,内部类,匿名对象

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

Linux基础操作指令

Linux的操作特点&#xff1a;纯命令行&#xff08;虽然也有图形化界面&#xff0c;但主要是工程师使用&#xff0c;意义不大&#xff09; windows的操作特点&#xff1a;图形化界面&#xff08;也有纯命令行的形式&#xff0c;但其更贴近大众&#xff0c;命令行学习成本高&…

服务暴露 traefik

一。traefik 部署 前置资源 还是那个网站&#xff0c;这里复制 entryPoints&#xff0c;进入traefik的大门 可选在哪台机器上部署 traefik 部署 用 Daemonset 的方式是为了&#xff0c;加机器到集群后&#xff0c;能自动部署traefik 到目标机器 注意 8084端口 必须加…

一种多策略改进黑翅鸢智能优化算法IBKA(2024年新出优化算法)种群初始化精英反向+透镜成像反向学习+黄金正弦变异策略

一种多策略改进黑翅鸢智能优化算法IBKA&#xff08;2024年新出优化算法&#xff09; 种群初始化精英反向策略透镜成像反向学习策略黄金正弦变异策略 文章目录 前言一种多策略改进黑翅鸢智能优化算法IBKA&#xff08;2024年新出优化算法&#xff09; 种群初始化精英反向策略透镜…