Linux 进程间通信(管道)

目录

一.理解进程间通信

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.xdnf.cn/news/1542870.html

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

相关文章

【算法业务】互联网风控业务中的续贷审批模型(融合还款意愿分层的逾期风险识别模型)

1、背景说明 本文旨在提出一种针对风控催收受限情况下,如何提升风控审批模型的风险识别能力,以缓解贷后催收的压力,降低贷款资金坏账的风险。这篇工作依然是很早期的项目,分享的目的一方面做笔记,另一方面则是希望其中…

多类别物体检测系统源码分享

多类别物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

YOLO航拍车辆和行人识别

YOLO航拍车辆和行人识别 图片数量9695,标注为xml和txt格式; class:car,pedestrian,truck,bus 用于yolo,Python,目标检测,机器学习,人工智能,深度学…

LeetCode 热题 100 回顾18

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

洛谷P5740——结构体运用

简单的结构体&#xff0c;但是要注意这个排序还有求和重复 时的特判 AC代码附在后面 #include<bits/stdc.h> using namespace std; struct Node{string name;int a,b,c,sum;//语文&#xff0c;数学&#xff0c;英语 }node[1000]; bool cmp(Node a,Node b){return a.sum…

三端全隔离压接端子485中继器磁耦隔离数据双向透传工业级2口信号放大器抗干扰防雷

美思联压接端子485中继器磁耦隔离工业级2口信号放大器抗干扰防雷https://item.taobao.com/item.htm?ftt&id736247434823 MS-H312S是一款专为工业自动化通信而生解决RS-485总线星型结构组网&#xff0c;解决复杂电磁场环境下RS-485大系统要求而设计的RS-485总线分割集线器(…

分布式网络存储技术是什么?分布式存储技术有哪些

分布式储存是指将数据分散存储在多个节点上的一种技术。但是你们知道分布式网络存储技术是什么&#xff1f;相比传统的集中式存储&#xff0c;分布式储存具有更高的可靠性和可用性。分布式网络存储是一种将数据分散存储在多个节点或服务器上的架构。 分布式网络存储技术是什么&…

【算法与数据结构复习】| 快速排序

今天刷力扣215.数组中第K个最大元素&#xff0c;题目要求用时间复杂度O(n)。因此跟着左程云算法课23复习了随机快速排序。 随机快速排序的核心思想就是在数组中随机选一个值x&#xff0c;把<x的值移到左边&#xff0c;>x的值移动到右边。x这个值必须在左边区间的最左边&a…

Java笔试面试题AI答之设计模式(3)

文章目录 11. Spring开发中的哪里使用了工厂设计模式 &#xff1f;1. BeanFactory2. 工厂方法模式3. 抽象工厂模式4. 示例说明总结 12. 什么是代理模式 &#xff1f;13. 请列举代理模式的应用场景 &#xff1f;14. 什么是原型模式 &#xff1f;15. 请简述Java中原型模式的使用方…

stm32 外部中断

1.每个IO都可以配置外部中断&#xff0c;中断的出发方式有上升沿、下降沿、双边沿。这个是在EXTI里配置。 2.所有IO总共分成了16组&#xff0c;&#xff08;PA0,PB0…&#xff09;、&#xff08;PA1,PB1…&#xff09;、&#xff08;PA2,PB2…&#xff09;,…,&#xff08;PA15…

【Proteus仿真】基于51单片机的电机调速和速度实时显示

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;可采用按键对电机进行方向的调控和速度的加减&#xff0c;并通过DAC0832设置放大电路进行对电机的设置&#xff0c;通过四位数码管显示电机转向和速度&#xff0c;非常精…

LLMs之PE:AI for Grant Writing的简介、使用方法、案例应用之详细攻略

LLMs之PE&#xff1a;AI for Grant Writing的简介、使用方法、案例应用之详细攻略 目录 AI for Grant Writing的简介 AI for Grant Writing的使用方法—提示资源 1、提示集合 2、提示工程 3、快速提示 为了提高文本清晰度 为了让文本更有吸引力 为了改进文本的结构和流…

变压器设备漏油数据集 voc txt

变压器设备漏油数据集 油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况&#xff0c;一般用于变电站的无人巡检&#xff0c;代替传统的人工巡检&#xff0c;与绝缘子的破损检测来源于同一课题。数据集一部分来自…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。 图…

hCaptcha 图像识别 API 对接说明

本文将介绍一种 hCaptcha 图像识别 API 对接说明&#xff0c;它可以通过用户输入识别的内容和 hCaptcha验证码图像&#xff0c;最后返回需要点击的小图像的坐标&#xff0c;完成验证。 接下来介绍下 hCaptcha 图像识别 API 的对接说明。 申请流程 要使用 API&#xff0c;需要…

使用思科搭建企业网规划训练,让网络全部互通,使用规则提高工作效率。

1. 企业背景&#xff1a; 某企业分为销售部、行政部、人力资源部、财务部、业务部、接待中心等主要六个部门&#xff1b;配置网管中心&#xff0c;允许网络管理员登录企业交换机和路由器对企业网络进行管理&#xff1b;配置服务器集群&#xff0c;设置FTP、DNS、WEB服务器&am…

泛微开发修炼之旅--44用友U9与ecology对接方案及源码

文章链接&#xff1a;44用友U9与ecology对接方案及源码

蓝桥杯算法之暴力

暴力 1.十进制数转换成罗马数字 2.判断给出的罗马数字是否正确 小知识 %&#xff08;模除&#xff09;&#xff1a; % 符号用作模除&#xff08;或取模&#xff09;运算符。模除运算是一种数学运算&#xff0c;它返回两个数相除的余数。 具体来说&#xff0c;如果 a 和 b 是…

分布式系统的CAP原理

CAP 理论的起源 CAP 理论起源于 2000 年&#xff0c;由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP 定理又被称作布鲁尔定理&#xff08;Brewer’s Theorem&#xff09;。2002 年&#xff0c;麻省理…

低代码开发平台:高效开发新体验

在数字化转型的浪潮中&#xff0c;企业对软件开发的需求日益加剧&#xff0c;对开发效率和响应市场变化的速度有着前所未有的要求。传统的软件开发方法由于其复杂性和耗时性&#xff0c;已经逐渐难以满足这种快速变化的需求。低代码平台作为一种新兴的开发工具&#xff0c;因其…