Linux 进程间通信(管道)

news2024/9/23 20:25:31

目录

一.理解进程间通信

1.进程间通信的意义

2.进程间如何实现通信呢?

二.匿名管道

1.匿名管道的底层原理

引用计数的应用

2.匿名管道代码实现

a.代码的整体框架

b.写接口

c.读接口

d.子进程资源回收

3.匿名管道的官方接口

4.*匿名管道四种情况和五种特性

a.管道的四种情况

b.管道的5种特性

5.匿名管道的应用(进程池)

三.命名管道

1.命令管道通信原理

2.指令级创建命名管道

3.命名管道代码实现

a.服务端创建命名管道,并向管道内写入数据

①创建命名管道文件

②删除命名管道文件

b.客户端从管道文件中读取数据

c.源码链接

4.命名管道的特点


一.理解进程间通信

1.进程间通信的意义

由于进程独立性,不同进程的资源(进程地址空间、文件描述符表、页表...等)是不共享的,所以,如果我们想实现多进程间协同工作,如:数据传输、资源共享、事件通知、进程控制...等,就需要进程间通信!!

2.进程间如何实现通信呢?

进程间通信的本质,就是让不同的进程能够看到同一份公共资源,这份资源通常是由操作系统提供的,而根据这块“公共资源”的不同,进程间通信的机制也就不同。常见进程间通信的方式有以下几种:①管道通信(基于文件);②共享内存通信(基于物理内存);③信号(基于中断);④消息队列(基于队列)

本文章主要讲的是管道通信,也就是让不同的进程看到同一份文件,一个进程向文件中写入数据,另一部分进程从文件中读取数据,实现最简单的进程间通信。

而管道通信,又分为:匿名管道和命名管道两种。且听博主细细道来~~

二.匿名管道

1.匿名管道的底层原理

我们知道,fork()创建子进程时,子进程会以父进程为模版,重新拷贝一份资源,而这份资源中就包括父进程的文件描述符表,而文件描述符表内存放的是,内存中被打开文件struct file结构体的地址。

换句话说,有了文件描述符表,就能找到文件结构体地址,有了地址,就能访问对应文件!!

这样一来,我们仅需在父进程中分别以读和写的方式打开一个文件,然后调用 fork() 创建子进程,由于父进程的文件描述符相同。所以,二者都可以访问这个文件,一个进程向文件中写入数据,另一进程从文件中读取数据,这就是匿名管道的底层原理!!

一个进程,把一个文件分别以读和写两种方式打开后,由于进程对文件内容数据的读取和写入位置不同,所以系统会生成两个fd文件描述符,一个供进程写入数据,另一个供进程读取数据。

图解如下:

引用计数的应用

上述中,父进程用读方式打开文件的同时,又用写方式打开该文件,并在文件描述符表中生成了两个fd,那么问题来了,当父进程用 close() 关闭其中一个fd时,该文件会不会被关闭呢?如果不会关闭,那该文件什么情况下才会真正被关闭呢?

答:文件的struct file内有一个引用计数,文件每被打开一次,这个引用计数都会++;文件每被关闭一次,引用计数都会--;当该引用计数减到0时,文件就会关闭!!

引用计数的应用场景:

1.硬链接:磁盘中与inode产生映射关系的文件名

2.内核数据结构中,指向struct file结构体的文件描述符的个数

3.shared_ptr智能指针

2.匿名管道代码实现

a.代码的整体框架

b.写接口

c.读接口

d.子进程资源回收

3.匿名管道的官方接口

官方给我们提供的 pipe() 接口,功能与我们上图手写的类似,唯一不同的是, pipe() 创建的是管道文件,read() 等接口与文件进行数据 IO 时,若读取到文件数据的末尾,read 并不会返回0,而是会一直阻塞,除非写端口关闭,read 才会返回0!!

注意:int pipefd[2] 是输出型参数,返回的两个值分别是以读和写的方式打开该管道的进程描述符数组的下标,即 fd1和 fd2。

4.*匿名管道四种情况和五种特性

a.管道的四种情况

1.如果管道内没有数据了,读端必须等待,直到有数据为止.

2.如果管道被写满了,写端必须等待,直到有空间为止.

3.如果写端关闭,读端会一直读,当读端会读到read返回值为0时,表示已经读到文件结尾.

4.如果读端关闭,写端一直写的话,OS会直接kill写端进程,即通过向写端进程发生SIGPIPE(13)信号,终止目标进程.

b.管道的5种特性

1.匿名管道,只允许具有血缘关系的进程之间进行通信,常用于父子进程.

2.匿名管道,默认给读写端要提供同步机制,即两个进程的执行具有一定的顺序性.

3.*面向字节流(多次写入,一次读出;一次写入,多次读出).

4.管道的生命周期是随进程的.

5.管道是单向通信(只能一端写,另一端读)的,半双工通信的一种特殊情况.

5.匿名管道的应用(进程池)

进程池:在系统调用层面创建进程是需要花费一定的时间和空间代价的,所以为节省用户的时间成本,OS会提前创建多个进程去等待用户下达的任务,我们将这些提前创建好的进程叫做进程池。

底层原理:

*进程池代码实现——基于匿名管道  

 源码链接:https://gitee.com/Coder-Li-YuJie/inter-process-communication

三.命名管道

1.命令管道通信原理

先前实现的进程池只能是具有血缘关系的进程才能进行通信,那么两个毫不相干的进程间如何使用管道进行通信?? --- 命名管道!!

匿名管道:父进程打开文件,而后创建子进程,通过文件描述符表的继承性,这样父子进程就可以基于同一个文件进行通信。

命名管道:直接让两个毫不相干的进程打开同一份文件,而后直接基于文件进行通信!!

原理:因为路径具有唯一性,所以,我们可以使用路径+文件名,来唯一的让不同进程看到同一份资源!两个进程通过打开同一份文件,向该文件缓冲区内写入或读取数据,并且文件缓冲区内的数据不会刷新到磁盘上。

两个进程打开同一份文件,内存里的文件缓冲区和文件的属性数据只会加载一份!!

2.指令级创建命名管道

创建一个管道文件的指令 —— mkfifo

如:mkfifo fifo

echo "hello world" > myfifo(向管道文件输入数据时,阻塞,因为管道的“读”端未打开)

将管道的“读”端打开后

管道文件的大小一直是0 ??

--- 这个管道是一个创建出来的磁盘级符号(内存级文件),在进行进程间通信的时候,就算该文件被打开,它的数据也不会向磁盘进行刷新!

3.命名管道代码实现

a.服务端创建命名管道,并向管道内写入数据

①创建命名管道文件

②删除命名管道文件

b.客户端从管道文件中读取数据

现象:只有当两个进程同时以读的方式和写的方式打开同一管道文件时,两个进程的代码才能够继续向后执行,否则,若写端打开,读端没打开,则写端进程等待;反之,亦是如此!!!!!

c.源码链接

https://gitee.com/Coder-Li-YuJie/naming-pipes-and-shared-memory

4.命名管道的特点

① 双向通信:虽然传统的管道是单向的(一个进程写,一个进程读),但命名管道可以被设计为双向的,允许两个进程既可以写入也可以读取数据。

②持久性:命名管道在文件系统中有一个名称,即使创建它的进程已经终止,该管道仍然存在,直到它被显式删除,如调用上述 DelFifo() 接口。

③多进程通信:传统的管道只能用于具有共同祖先的进程间的通信(例如,父子进程)。而命名管道可以被不相关的进程用来通信。

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

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

相关文章

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题:Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

数据结构——顺序表、链表

目录 前言 一,数据结构 1,什么是数据结构? 2,有什么类型? 二,顺序表 1,线性表 2,顺序表基本结构 3,动态顺序表的功能实现 三,链表 1,链…

Go 1.19.4 路径和目录-Day 15

1. 路径介绍 存储设备保存着数据,但是得有一种方便的模式让用户可以定位资源位置,操作系统采用一种路径字符 串的表达方式,这是一棵倒置的层级目录树,从根开始。 相对路径:不是以根目录开始的路径,例如 a/b…

torch.nn系列函数学习 --- Conv2d函数

该函数的官方文档: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone)…

排序题目:将矩阵按对角线排序

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法思路和算法代码复杂度分析 题目 标题和出处 标题:将矩阵按对角线排序 出处:1329. 将矩阵按对角线排序 难度 5 级 题目描述 要求 矩阵对角线是一条从矩阵最上面行或者最左侧列中的某…

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑),然后C盘、D盘。 Linux系统的根目录是/,我们可以使用cd /进入根目录,然后使…

共享打印机,局域网搜不到

如果共享打印机后,局域网内其余机器检索不到 1. 排查 是否启用来宾账户(Guest) 2. 网络和共享中心->更改高级共享设置->启用网络发现、启用文件和打印机共享、关闭密码保护共享 排查基本可以解决搜索不到打印机问题

Transformer动画讲解

**Transformer工作原理**** **一、**** ******GPT的核心是Transformer******** *GPT* : **GPT(Generative Pre-trained Transformer)**** ****是一种基于单向Transformer解码器的预训练语言模型,它通过在大规模语料库上的无监督…

MatrixOne 助力某电信运营商构建低成本高性能车联网管理系统

客户基本情况 该电信运营商在物联网领域深耕多年,致力于为企业和个人提供全面的物联网解决方案,包括智能连接、设备管理、数据采集与分析等核心服务。凭借其强大的网络覆盖和技术优势,该运营商为各行业提供高效、安全、可靠的物联网服务&…

风速传感器一文浅谈 了解自然的力量

产品概述 本产品主要采用优质聚合物碳纤维为原材料,具有良好的防腐、防侵蚀等特点,能够保证仪器长期使用不起锈,同时配合内部顺滑的轴承系统,确保了信息采集的准确性。外型小巧轻便,便于携带和组装,三杯设…

MCU和YT9218交换机通过RMII连接

1、可以通过带RMII的MCU和EXT1端口连接,将MCU配置为RMII 100M/全双工就可以通 2、原先在这里改SW配置, 一直不通 3、后来通过api调用可以通 这样改: 在初始化后,添加下面代码 //使能RMII,phy模式 #define Port5 …

【LeetCode】动态规划—使用最小花费爬楼梯(附完整Python/C++代码)

动态规划—#746. 使用最小花费爬楼梯 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 在这个问题中,我们有一个数组 c o s t [ ] cost[] c…

单细胞SCENIC简单可视化分析学习和整理

SCENIC教程中给出三个方法进行下游的可视化分析,分别可以选择网页(SCope)平台,R或者python进行分析。 1、网页版:https://scope.aertslab.org/ 把数据从左侧工具栏处上传之后就可以个性化分析了~ 2、R和Python就殊途同归啦~ 笔者基于githu…

linux/CentOS 开机启动程序

前言 TencentOS Server 3.1 (TK4)适用于自己编写启动脚本的情况 编写启动脚本 比如启动tomcat,kaijiqidong_tomcat.sh #!/bin/bashecho "kaijiqidong_tomcat on date ." >> kaijiqidong_tomcat.log 2>&1cd /x/xx/xxx sh /x/tomcat/bin/s…

老照片修复软件有哪些?6个工具轻松搞定

在回忆的长廊中,老照片承载着岁月的痕迹和珍贵的记忆。 然而,时间的流逝往往让这些宝贵的瞬间变得模糊不清。幸运的是,现代科技赋予了我们修复这些老照片的能力。 面对市场上众多的老照片自动修复软件,选择一个合适的工具变得尤…

Apache APISIX学习(1):介绍、docker启动

一、介绍 Apache APISIX 是一个动态、实时、高性能的 API 网关, 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。你可以把 Apache APISIX 当做流量入口,来处理所有的业务数据,包括动态路由、动态上游…

得物自建 Redis 无人值守资源均衡调度设计与实现

目录: 一、为什么要做资源均衡调度 二、为什么要做自动化资源均衡调度 三、如何合理选择迁移节点 四、如何保障迁移过程中可靠性1. 添加从节点2. 检查同步数据正常3. 执行主从切换4. 检查主从切换正常5. 删除待迁移节点6. 消息通知 五、迁移任务管理展示 六、总结 …

户用光伏项目难管理,到底该怎么办?

一、鹧鸪云光伏业务管理软件:一站式管理利器 鹧鸪云光伏业务管理软件,作为一款专为光伏行业量身定制的智能化管理工具,集成了项目管理、运维管理、数据分析、用户服务等多功能模块于一体,旨在通过数字化手段,实现户用…

Nature Genetics|三代测序微量建库技术:媲美WGBS的直接甲基化检测

DNA修饰和甲基化是理解基因调控机制的关键。以往,我们的经验表明,使用三代测序从未经扩增的长DNA模板中同时读取序列信息和碱基修饰,需要投入大量的DNA样本来构建文库。 今天,小编带大家看一篇2024年发表于《Nature Genetics》的…

【MAUI】FlexLayout

文章目录 概述属性方向和对齐方式DirectionWrapJustifyContentAlignItemsAlignContent 圣杯布局来源 概述 FlexLayout弹性布局,和前端的Flex弹性布局,几乎一样。FlexLayout是容器,可以定义Direction/主轴方向、Wrap/子元素在主轴方向上是否换…