Linux——进程间通信:管道

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

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

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

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

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

相关文章

速度规划:s形曲线应用(变速 停车)opencv c++显示(3)

理论篇 先看该篇,这里沿用了里面的变量。 应用推导篇 分为变速和停车两部分(字迹潦草,可结合代码看) 代码篇 变速函数入口: velocityPlanner vp; vp.SetParameters(0, 1);停车函数入口: ParkingVelo…

挑战杯 python+大数据校园卡数据分析

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖&am…

23.HarmonyOS App(JAVA)堆叠布局StackLayout使用方法

不常用 StackLayout直接在屏幕上开辟出一块空白的区域,添加到这个布局中的视图都是以层叠的方式显示,而它会把这些视图默认放到这块区域的左上角,第一个添加到布局中的视图显示在最底层,最后一个被放在最顶层。上一层的视图会覆盖…

mysql入门到精通005-基础篇-约束

1、概述 1.1 概念 约束是作用于表中字段上的规则,用于限制储存在表中的数据。 1.2 目的 保证数据库中数据的正确性、有效性和完整性。 1.3 常见的约束分类 一旦谈到外键,则至少涉及2张表约束是作用于表中字段上的,可以在创建表/修改表的…

机器学习-梯度下降法

不是一个机器学习算法是一种基于搜索的最优化方法作用:最小化一个损失函数梯度上升法:最大化一个效用函数 并不是所有函数都有唯一的极值点 解决方法: 多次运行,随机化初始点梯度下降法的初始点也是一个超参数 代码演示 impor…

【语音合成】中文-多情感领域-16k-多发音人

模型介绍 语音合成-中文-多情感领域-16k-多发音人 框架描述 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用,故此处仅涉及参数法。 参数TTS系统可分为两大模块:前端和后端。 前端包含文本正则、分词、多音字预…

在angular12中proxy.conf.json中配置详解

一、proxy.conf.json文件的目录 二、proxy.conf.json文件中的配置 "/xxx/api": {"target": "地址/api","secure": false,"logLevel": "debug","changeOrigin": true,"pathRewrite": {"…

【华为 ICT HCIA eNSP 习题汇总】——题目集13

1、以下在项目规划阶段中需要完成的工作是()。 A、确定技术方案 B、了解项目背景 C、选择网络产品 D、规划 IP 地址 考点:网络规划与设计 解析:(B) 确定技术方案是在网络规划的设计阶段完成的工作&#xff…

团队管理-如何组织好一场会议

一、不同维度分析 1、按照时间维度 可分为 会前、会中、会后 会前 1、确定会议时间 尽可能选择参与者都空闲的时间,确保参与者都有时间可以参加,可以提前询问大家有空的时间,如果部分人没有时间但是会议比较紧急,可以让其选择…

2024:AI 大冒险

2024:AI 大冒险 2023 年就像一场疯狂的过山车,现在让我们一起系好安全带,来预测一下 2024 年的五大惊心动魄事件吧! 一、AI 惹祸升级 嘿,2024 年可要小心了!AI 这家伙可能会变得更调皮捣蛋。人们可能会用…

Bootstrap5 导航组件和面包屑

Bootstrap5 导航组件和面包屑 Bootstrap5 提供了一种简单快捷的方法来创建基本导航,它提供了非常灵活和优雅的选项卡和Pills等组件。 Bootstrap5 的所有导航组件,包括选项卡和Pills,都通过基本的 .nav 类共享相同的基本标记和样式。 使用 B…

springboot162基于SpringBoot的体育馆管理系统的设计与实现

体育馆管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕…

搜索引擎DuckDuckGo代理指南

DuckDuckGo作為一款搜索引擎,同時擁有自己的流覽器,高度保護用戶隱私,使其有別於其他收集和利用用戶數據進行定向廣告的搜索引擎。然而,單獨使用DuckDuckGo並不能保證線上完全匿名。如果你想進一步保護隱私,那就需要使…

深度解析源码,Spring 如何使用三级缓存解决循环依赖

目录 一. 前言 二. 基础知识 2.1. 什么是循环依赖? 2.2. 三级缓存 2.3. 原理执行流程 三. 源码解读 3.1. 代码入口 3.2. 第一层 3.3. 第二层 3.4. 第三层 3.5. 返回第二层 3.6. 返回第一层 四. 原理深度解读 4.1. 什么要有三级缓存? 4.2.…

深入解析 Spring 事务机制

当构建复杂的企业级应用程序时,数据一致性和可靠性是至关重要的。Spring 框架提供了强大而灵活的事务管理机制,成为开发者处理事务的首选工具。本文将深入探讨 Spring 事务的使用和原理,为大家提供全面的了解和实际应用的指导。 本文概览 首…

ELAdmin 的 CRUD

数据表结构 弄个测试的数据表,不同类型的几个字段,表名位 mp_reply。 生成代码 ELAdmin 可以自动生成代码。 左侧目录系统工具–代码生成,点开以后可以看到上面创建的数据表mp_reply,点击配置。 进入的页面内容有两部分&#…

【Py/Java/C++三种语言详解】LeetCode每日一题240207【二叉树BFS】LeetCode2641、二叉树的堂兄弟节点II

有华为OD考试扣扣交流群可加948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目描述解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode2641、二叉树的堂…

C++——stack与queue与容器适配器

1.stack和queue的使用 1.1stack的使用 栈这种数据结构我们应该挺熟了,先入后出,只有一个出口(出口靠栈顶近)嘛 stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以操作: empty&#xff1…

6-3、T型加减速单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:根据前两节内容,已完成所有计算工作,本节内容介绍具体单片机程序流程及代码 一、程序流程图 根据前两节文章内容可知,T型加减速的关键内容是运动类型的判断以及定时…

Nacos安装,服务注册,负载均衡配置,权重配置以及环境隔离

1. 安装 首先从官网下载 nacos 安装包,注意是下载 nacos-server Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 下载完毕后,解压找到文件夹bin,文本打开startup.cmd 修改配置如下 然后双击 startup.cmd 启动 nacos服务,默认…