Linux——进程间通信:管道

我们在开发过程中,可能会碰到两个或多个进程需要协同进行,这两个进
程之间有着一定的关系,这个进程可能会需要另一个进程的某些消息来达
到自己的目的,或者是一个进程控制着另一个进程,又或者是需要某种资
源的共享。但是我们知道进程具有独立性,进程是不可能直接将自己的资
源交给其他进程的。所以就会有进程间通信,它是通过不同进程间能看到
同一份资源,通过这份资源来实现进程资源的传输等等进程间操作。所以
今天就由我来介绍进程间通信的其中一种方式:管道。

进程间通信是操作系统中让进程间具有:数据传输、资源共享、通知事件、进程控制的功能,那既然是功能,就会有很多种方式,下面的管道是其中一种方式。

a. 管道是什么?

我们在使用shell的时候,有时候会使用这样的命令:
在这里插入图片描述
而中间的符号就是管道的意思,我们知道ps是一个命令,那它就是一个进程,gre也是一个进程,首先ps axj命令把系统中运行的进程都要准备打印到屏幕上,但是显然它没有,而是把这份资源通过管道传输给grep这个进程,而grep进程接收到这份资源后,进行过滤出有关bash的进程再输出到屏幕上。
在这其中ps和grep是两个进程,但是ps把它产生的资源给了grep进程。而他们中间的传输数据用到的就是管道。
进程间通信的本质也是如此:通过让不同的进程能够看到同一份资源,而这份资源通常由操作系统提供。

b. 匿名管道

而管道又分为匿名管道和命名管道,上面的命令行中的管道我们可以看到它是没有名字的,它就是匿名管道,而这是命令行的匿名管道,我们代码中的匿名管道是什么呢?
在这里插入图片描述
这就收我们使用到的接口,他的大致意思是当我们使用这个接口的时候需要传入一个大小两个整形的数组为输出型参数,然后,这个数组中会存入两个被不同方式(读和写)打开的同一个管道文件fd。
那现在我们该如何实现不同进程间通信呢?
在这里插入图片描述
在这里插入图片描述
可以看到我们的打印是由父进程进行的,但是数据是由子进程提供的。这样就实现了进程间通信。

c. 匿名管道的原理

而上述进程间通信则是利用了操作系统创建子进程的特点,我们在创建子进程的同时,子进程会继承父进程的内核数据结构,进程pcb、文件描述符表等等都会被继承(拷贝)下来,所以子进程和父进程的进程描述符表中能看到同一个文件结构体指针,也就能看到同一份文件。
pipe这个接口就只是以读和写的方式打开了同一个文件,然后返回两个结构体的指针下标。
这个时候我们创建子进程,则这两个文件fd也会被子进程看到,假如我们要让子进程写(输出数据),父进程(读)接收数据,则需要子进程关闭文件的读端(关闭以写方式打开的文件fd),父进程关闭写端。形成信道。要让子进程接收数据,父进程输出数据的话反过来就可以。
需要注意的是,这个被打开的文件,就是管道文件,这个文件也是内存级文件,也就是使用pipe接口时,操作系统会在内存中创建一个内存级文件,供进程使用。
上面说了,使用pipe后会以不同方式打开同一个文件,而文件被打开主要部分有三个:文件结构体,文件页缓冲区,文件的读写方法集。在这里我们就要明确一点,当一个进程以不同方式(读和写)打开一个文件的时候,内存中只会有一个该文件的页缓冲区,读写方法集,但是会有两个文件结构体,因为在文件上读和写,它们的位置大概率会不同。所以是会有两个文件结构体:

在这里插入图片描述
有人会提出疑问,为什么要关闭父子进程的某个读写呢?不关闭不是双向通信了吗?
其实这是为了管道文件的实现的简便,如果支持双向通信的话,识别页缓冲区的数据就得需要分辨是哪个进程需要接收或者是哪个进程发出的,如果是多个消息挤在一起会很麻烦,所以管道通信是单向的。如果想要实现双向通信可以使用两个管道。
以上我们让父子两个进程看到了同一份资源(管道文件),从而能够使父子进程实现进程间通信。那既然父子间能够通过管道文件通信,那么两个子进程能不能实现通信呢?一个进程的父进程和它的子进程能不能实现通信呢?显然是可以的,都是利用了操作系统创建子进程的特点。但是如果是两个毫不相关的进程呢?通过这样的方式可以实现进程间通信吗?那就不行了。所以:匿名管道适用于拥有“血缘关系”的进程。

d. 匿名管道的特点

我们首先让写端一直写入数据但是不读:
在这里插入图片描述

在这里插入图片描述

可以看到,当我们只写不读时,当我们写到一定程度,就不会再写了,这其实是缓冲区已经满了。我们可以通过代码来查看它这个缓冲区有多大,具体方法是让它一次写入一字节:
在这里插入图片描述
而65535是63KB。那说明我这个Linux系统中的匿名管道文件的缓冲区大小是63KB。
如果是只写不读呢?
在这里插入图片描述
在这里插入图片描述
负责读的父进程则会一直阻塞在read函数
现在我们试着关闭写端:
在这里插入图片描述
读端会一直读到零。
如果关闭写端呢?
在这里插入图片描述
在这里插入图片描述

这里我们直接让父进程退出,但是子进程可没有退出。所以我们会得出,当读端关闭时,写端也会直接关闭。
而这里的写端进程关闭是被操作系统使用13号信号杀掉的,我们可以通过回收子进程得知:
在这里插入图片描述

在这里插入图片描述

所以我们会总结出匿名管道的四种情况:

如果管道中没有了数据,读端要一直等待。
如果管道写满了数据,则必须等读端读走数据,直到有空间写入。
写端关闭,读端的read函数会返回0。
读端关闭时,写端进程会关闭。

e. 命名管道

既然有匿名管道,那就有命名管道。
命名管道和匿名管道的原理基本一样,我们会先使用mkfifo命令创建一个管道文件:
在这里插入图片描述
现在我们使用一下这个文件:
当我们向这个文件写入时:
在这里插入图片描述
光标会直接卡住,需要我们在另一个渠道将文件中的内容读出来。
在这里插入图片描述
这也是命名管道在命令行中的使用方式
命名管道它本质上还是一个内存文件,它不会将数据存储到磁盘中。这里的文件名也只是作为内存文件的一种映射。这个文件的存在是为了实现进程间通信的。下面我们来看看代码的命名管道怎么使用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
它的原理基本上与匿名管道一致。而命名管道就可以进行毫不相关的进程间的通信,只要两个进程中以一个读一个写的方式打开命名管道文件就可以实现进程间通信。因为路径是唯一的,我们可以使用路径+文件名的方式让不同进程看到同一份资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BFS与DFS初级练习(排列数字,n-皇后,走迷宫)

BFS与DFS初步了解 DFS(深度优先搜索)和BFS(广度优先搜索)是两种常用的图遍历算法。 DFS是一种递归的搜索算法,它从起始节点开始,沿着路径依次访问与当前节点相邻的未访问节点,直到无法继续访问…

【易学】周易入门 ③ ( 玄学五术 - 山医命相卜 | 天命无常 唯有德者居之 | 预测学模型 | 五行学说 | 五行相生 | 五行相克 )

文章目录 一、玄学五术 - 山医命相卜二、天命无常 唯有德者居之三、预测学模型四、五行学说1、五行相生2、五行相克 一、玄学五术 - 山医命相卜 玄学五术 : 山 : 修行 " 肉体 " 和 " 精神 " , 以寻求 身心超脱 ; 肉体修行 - 拳法 : 太极拳 , 五禽戏 , 易筋…

那些 C语言指针 你不知道的小秘密 (完结篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

BUUCTF LKWA

1.访问页面。 2.选择 Variables variable 关卡 3.获得flag http://357dab81-78b8-4d74-976a-4a69dd894542.node5.buuoj.cn:81/variables/variable.php?funcpassthru&inputcat%2Fflagflag{0020ced6-8166-4fa5-87a7-7d93ee687c3e}

键盘重映射禁用 CtrlAltDel 键的利弊

目录 前言 一、Scancode Map 的规范 二、禁用 CtrlAltDel 的方法及其缺陷 三、编程实现和测试 3.1 C 实现的简易修改工具 3.2 C# 实现的窗口工具 四、总结 本文属于原创文章,转载请注明出处: https://blog.csdn.net/qq_59075481/article/details…

PySQLRecon:一款功能强大的MSSQL安全测试工具

关于PySQLRecon PySQLRecon是一款功能强大的MSSQL安全测试工具,该工具基于SQLRecon实现其功能,可以帮助广大红队研究人员针对MSSQL执行攻击性安全测试。 环境配置 由于该工具基于Python 3开发,因此我们首先需要在本地设备上安装并配置好Pyt…

鸿蒙小案例-你画我猜

鸿蒙小案例-你画我猜 1.准备组件(组件布局) 2.实现跟随鼠标画笔画出图案功能 3.实现复制上面的画笔的图案功能 4.其他小功能1.组件的准备 画布的组件官方给的API是Canvas,需要传递一个参数CanvasRenderingContext2D 直接搜索API 使用官方案例 private settings: …

小技巧 | 如何将win11回退至win10

当你不小心点错将电脑的win10系统更新成win11系统了(但没有完全更新),你会怎么做呢? 1.在“开始”菜单界面点击“设置”选项 2.点击“更新和安全”选项 3.在“更新历史记录”中点击“恢复选项” 4.点击“返回”选项 会弹出以下界面…

three.js 细一万倍教程 从入门到精通(二)

目录 三、全面认识three.js物体 3.1、掌握几何体顶点_UV_法向属性 3.2、BufferGeometry设置顶点创建矩形 3.3、生成酷炫三角形科技物体 四、详解材质与纹理 4.1、初识材质与纹理 4.2、详解纹理偏移_旋转_重复 偏移 旋转 重复 4.3、设置纹理显示算法与mipmap mapFil…

【动态规划】:泰波那契模型_解码方法

朋友们、伙计们,我们又见面了,本专栏是关于各种算法的解析,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏&…

【网工】华为设备命令学习(综合实验一)

实验要求和实验成果如图所示。 LSW2不需要其他配置&#xff0c;其下就一台设备&#xff0c;不需要区分。 LSW3配置如下&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]un in en //关闭系统提示信息 Info: Information …

LeetCode、72. 编辑距离【中等,二维DP】

文章目录 前言LeetCode、72. 编辑距离【中等&#xff0c;二维DP】题目链接与分类二维DP 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容…

VTK Python PyQt 监听键盘 控制 Actor 移动 变色

KeyPressInteractorStyle 在vtk 中有时我们需要监听 键盘或鼠标做一些事&#xff1b; 1. 创建 Actor&#xff1b; Sphere vtk.vtkSphereSource() Sphere.SetRadius(10)mapper vtk.vtkPolyDataMapper() mapper.SetInputConnection(Sphere.GetOutputPort()) actor vtk.vtkAc…

Vue核心基础6:Vue内置指令、自定义指令、生命周期

1 Vue中的内置指令 <script>const vm new Vue({el: #root,data: {n: 1,m: 100,name: Vue,str: <h3>你好</h3>}})</script> 1.1 v-text <div v-text"name"></div>1.2 v-html <div v-html"str"></div> …

Spring Boot 笔记 012 创建接口_添加文章分类

1.1.1 实体类添加校验 package com.geji.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称NotEmptypriva…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第一套(完善程序题)

CCF认证CSP-J入门组模拟测试题第一套 三、完善程序题 第一题 九宫格 请完善下面的程序,将1~9个数字分别填人3x3的九宫格中,第一行的三个数字组成一个三位数。要使第二行的三位数是第一行的2倍,第三行的三位数是第一行的3倍且每个格子里的数字都不能重复,现在要求输出所有的填…

python输出字符 2022年12月青少年电子学会等级考试 中小学生python编程等级考试二级真题答案解析

目录 python输出字符 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python输出字符 2022年12月 python编程等级考试级编程题 一、题目要求 …

《CSS 简易速速上手小册》第2章:CSS 布局与定位(2024 最新版)

文章目录 2.1 Flexbox&#xff1a;灵活的布局解决方案2.1.1 基础知识2.1.2 重点案例&#xff1a;创建一个响应式导航菜单2.1.3 拓展案例 1&#xff1a;卡片布局2.1.4 拓展案例 2&#xff1a;中心对齐的登录表单 2.2 Grid 布局&#xff1a;网格系统的魔力2.2.1 基础知识2.2.2 重…

渗透测试练习题解析 3(CTF web)

1、[网鼎杯 2020 朱雀组]phpweb 1 考点&#xff1a;反序列化漏洞利用 进入靶场&#xff0c;查看检查信息&#xff0c;发现存在两个参数 func 和 p 查看页面源代码 payload&#xff1a;funcfile_get_contents&pphp://filter/resourceindex.php 整理后&#xff0c;就是 PHP 代…

数据结构与算法:单链表

朋友们大家好&#xff0c;本节来到数据结构与算法的新内容&#xff1a;单链表 在上篇文章中&#xff0c;我们知道顺序表通常需要预分配一个固定大小的内存空间&#xff0c; 通常以二倍的大小进行增容&#xff0c;可能会造成空间的浪费&#xff0c;本篇文章我们介绍的链表可以解…