第六部分:1---进程间通信,匿名管道

目录

进程间通信

进程间通信的目的:

进程间通信的本质:

管道:

管道的定义:

匿名管道

单向通信的管道通路:

进程和文件之间的解耦:

单向管道的读写端回收问题:

管道通信主要实现动态数据传递:

父子进程通过管道传输数据的案例:

匿名管道的4种情况:

匿名管道的5种特性:


进程间通信

进程间通信的目的:

  • 数据传输:不同进程之间需要传递信息或共享数据。

  • 资源共享:多个进程可以共享系统资源。

  • 事件通知:进程之间可以通过通信机制向对方发送信号或消息。

  • 进程控制:一个进程可以通过通信机制对另一个进程的状态进行控制,如启动、挂起、终止等操作。进程控制有助于父进程管理子进程的执行和生命周期。

进程间通信的本质:

  • 进程间同行的本质,就是让不同的进程看到同一份资源,而这份资源不是由进程提供,而是由操作系统提供。

管道:

管道的定义:

  • 管道是一种进程间通信机制,用于在两个或多个进程之间传递数据,允许一个进程的输出作为另一个进程的输入来使用。管道的本质是内存中的一块缓冲区。

  • 它通过将数据流从一个进程的标准输出(stdout)直接传送到另一个进程的标准输入(stdin),从而实现数据的流式传递。

匿名管道

  • 主要用于在父子进程或兄弟进程之间传递数据。它是最简单、最基础的管道形式,特点是单向传输,即数据只能从一端(写端)写入,从另一端(读端)读取。

  • 如果要实现双向通信,需要分别创建两个管道。

单向通信的管道通路:
  • 创建单向管道:管道的本质是内存中的一块缓冲区,在使用 pipe() 系统调用创建单向管道时,内核会自动为管道分配两个文件描述符:一个用于读端,一个用于写端。这两个文件描述符分别对应这块缓冲区的读指针和写指针。

  • 注意,管道的读写端不是直接通过文件打开两次实现,而是通过 pipe() 生成一个匿名的内存缓冲区(管道),分别分配给读端和写端。

  • 父进程fork() 后,子进程会继承父进程的文件描述符表。这意味着子进程会复制父进程的文件描述符表项,指向同一个内核文件表项和缓冲区。因此,父进程和子进程都拥有两个文件描述符,分别指向管道的读端和写端。

  • 为了实现单向通信,父进程关闭管道的读端(只需要写入数据)。子进程关闭管道的写端(只需要读取数据)。这样父进程只能往管道里写数据,而子进程只能从管道里读数据,形成单向通信。

  • 实现通信:此时,父进程通过管道的写端将数据写入内核的管道缓冲区,子进程通过管道的读端读取数据。管道内部实现了数据同步,父进程在写满缓冲区之前可以持续写数据,而子进程读取数据时会从缓冲区中取出。

进程和文件之间的解耦:

  • 文件结构体中有一个引用计数器(reference counter),用于跟踪有多少个文件描述符指向该文件。当一个新的文件描述符指向这个文件结构体时,计数器会加一;当一个文件描述符被关闭时,计数器会减一。

  • 当一个进程关闭文件描述符(例如调用 close(fd)),文件描述符表中该文件描述符所指向的文件结构体的引用计数会减少一。但此时文件并不会立即关闭,因为内核会检查这个文件结构体的引用计数。

  • 当文件结构体的引用计数降为零时,意味着没有任何文件描述符再指向该文件。这时,内核会释放与该文件相关的资源,关闭文件,清理内核中的文件表项和相关的数据结构。

  • 这种设计减少了文件与进程之间的耦合。进程不在直接管理文件的关闭,而是交给操作系统来统一管理。

单向管道的读写端回收问题:
  • 在形成单向管道后,开始传递数据,数据传递完毕,是否需要关闭父子进程的读写端呢?

  • 如果子进程在完成任务后立即退出,那么不需要显式关闭管道的读端。因为当子进程终止时,操作系统会自动回收它所持有的所有资源,包括打开的文件描述符。

  • 对于父进程,在完成数据写入后,如果不再使用管道,应显式调用 close() 关闭写端。虽然父进程退出后系统会回收资源,但在父进程继续运行的情况下,未关闭的文件描述符可能会造成资源浪费或影响其他操作。

管道通信主要实现动态数据传递:
  • 当父进程通过 fork() 创建子进程时,子进程会继承父进程的某些资源,包括文件描述符、环境变量和内存中的数据(在写时拷贝机制下),从而实现父子间的静态数据传递。这种传递的特点是:父进程的数据在创建子进程时就已经存在,子进程在初始时拥有这些数据的副本。然而这些数据是静态的,一旦子进程启动后,父子进程各自拥有自己的独立副本,互相的修改不会影响对方。

  • 如果需要在父子进程之间实现动态数据传递,即:在运行过程中父子进程能够实时通信和交换数据,静态传递方式是不够的。这种情况下,就需要使用管道(pipe)或其他进程间通信(IPC)机制来实现动态数据传递。

父子进程通过管道传输数据的案例:
#include <iostream>
#include <unistd.h>
#include <cassert>
#include <cerrno>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstring>
#define MAX 1024
using namespace std;
​
int main()
{int pipearr[2]={0}; //创建管道int n = pipe(pipearr); //pipearr是一个输出型参数assert(n == 0); //断言是否创建成功
​pid_t id = fork();//创建子进程if (id < 0){perror("pid");return 1;}
​if(id==0){//childclose(pipearr[0]); //子进程关闭读端int cnt=10;while(cnt) //子进程向管道写入{char mess[MAX];snprintf(mess,sizeof(mess),"pid:%d,cnt:%d",getpid(),cnt);cnt--;write(pipearr[1],mess,strlen(mess));sleep(1);}exit(0);}//parentclose(pipearr[1]); //父进程关闭写端char buff[MAX];while(true) //父进程持续读取管道数据{ssize_t n=read(pipearr[0],buff,sizeof(buff)-1);if(n>0){buff[n]='\0';cout<<buff<<endl;}}
​pid_t ret=waitpid(id,nullptr,0); //父进程等待子进程if(ret==id){cout<<"wait success"<<endl;}
​return 0;
};
匿名管道的4种情况:
  • 正常情况下,管道没有数据了,读端会一直等待,直到写端写入数据到管道。

  • 正常情况下,管道被写满,写端会停止写入,直到读端读取数据后管道出现可用空间。

  • 写端关闭,读端read读取,会持续接收到返回值0,表示读到文件的结尾。

  • 读端关闭,写端进程会直接被操作系统发送13号信号杀死,可以通过父进程接受子进程的退出码验证。

匿名管道的5种特性:
  • 匿名管道,允许具有血缘关系的进程通信,常用于父子进程。

  • 匿名管道,会提供读写端的同步机制,

  • 匿名管道,面向字节流读取,他会按照你指定的大小尽可能从缓冲区读取数据,如果读写速率不匹配,每次写入很少的数据,在很多次写入后才读取一次,那么一次读取可能读取到多次写入的数据。

  • 管道是有上限的,无法一直写入。

  • 管道的生命周期跟随进程,进程结束,管道释放。

  • 管道是单向通信的,是半双工通信的一种特殊情况。

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

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

相关文章

CS61C 2020计算机组成原理Lecture03

1、C Operators Operator Precedence 2、Arrays 1、Pointing to Different Size Objects 2、sizeof&#xff08;&#xff09; 3、 Struct Alignment 四字节边界&#xff1a;指的是内存地址能够被4整除的情况。在计算机内存中&#xff0c;每个存储位置都有一个唯一的地址。当…

算法训练——day16快乐数

202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为…

【数据结构】数据结构系列学习笔记——导航篇

一&#xff1a;概述 数据结构是计算机科学中的核心概念之一&#xff0c;是优化算法性能和资源利用率的关键。在软件开发和数据处理中&#xff0c;选择合适的数据结构对于算法的效率至关重要。数据结构的选择通常基于数据的使用模式&#xff0c;包括数据元素之间的关系、数据的存…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统&#xff0c;包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要&#xff0c;由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面&#xff0c;采用 3.3V 直流电源供…

WPF 的TreeView的TreeViewItem下动态生成TreeViewItem

树形结构仅部分需要动态生成TreeViewItem的可以参考本文。 xaml页面 <TreeView MinWidth"220" ><TreeViewItem Header"功能列表" ItemsSource"{Binding Functions}"><TreeViewItem.ItemTemplate><HierarchicalDataTempla…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤&#xff1a; (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…

虚拟机vaware中cpu设置跑满大核

首先&#xff0c;大核速度快&#xff0c;并且在资源紧张时大核优先&#xff0c;小核甚至是闲着围观大核跑满。其次&#xff0c;遇到经常切换操作虚拟机和win11的使用场景&#xff0c;切换核心本身也会造成一点卡顿&#xff0c;降低虚拟机里操作流畅度。另外&#xff0c;13代在你…

马斯洛需求理论(人类需求的五个层次)用户体验五要素四点心智模型

一&#xff1a;核心用户 1.1 什么是核心用户 潜在用户 &#xff1a;未使用该产品的用户&#xff0c;但是有使用的需求。目标用户 &#xff1a;已经使用产品的普通用户&#xff0c;活跃度低。种子用户 &#xff1a;活跃度比较高&#xff0c;对产品的熟悉程度比较高&#xff0c…

无人机光电吊舱的技术!!

1. 成像技术 可见光成像&#xff1a;通过高分辨率相机捕捉地面或空中目标的清晰图像&#xff0c;提供直观的视觉信息。 红外热成像&#xff1a;利用红外辐射探测目标的温度分布&#xff0c;实现夜间或恶劣天气条件下的隐蔽目标发现。 多光谱成像&#xff1a;通过不同波段的光…

windows C++ 并行编程-异步消息块(一)

代理库提供了多种消息块类型&#xff0c;使你能够以线程安全的方式在应用程序组件之间传播消息。 这些消息块类型通常与 concurrency::send、concurrency::asend、concurrency::receive 和 concurrency::try_receive 等各种消息传递例程配合使用。 本文包含以下各节&#xff1…

Linux:进程(二)

目录 一、cwd的理解 二、fork的理解 1.代码共享 2.各司其职 3.fork的返回值 三、进程状态 1.进程排队 2.进程状态 运行状态 一、cwd的理解 cwd&#xff08;current working directory&#xff09;。译为当前工作目录。 在C语言中&#xff0c;使用fopen函数打开文件时&…

React-Hook原理

前置知识 闭包 在 Hook 的应用比如 dispatch 函数,也就是 useState 返回的第二个参数 闭包是指有权访问另一个函数作用域中变量或方法的函数,创建闭包的方式就是在一个函数内创建闭包函数,通过闭包函数访问这个函数的局部变量, 利用闭包可以突破作用链域的特性,将函数内部…

IDEA去除掉虚线,波浪线,和下划线实线的方法

初次安装使用IDEA&#xff0c;总是能看到导入代码后&#xff0c;出现很多的波浪线&#xff0c;下划线和虚线&#xff0c;这是IDEA给我们的一些提示和警告&#xff0c;但是有时候我们并不需要&#xff0c;反而会让人看着很不爽&#xff0c;这里简单记录一下自己的调整方法&#…

基于ssm+vue+uniapp的面向企事业单位的项目申报小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

水果成熟度检测系统源码分享

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

mysql事务的隔离级别学习

事务的隔离级别: ⅰ. 读未提交 ⅱ. 对已提交 &#xff08;解决 脏读&#xff09; ⅲ. 可重复读 &#xff08;解决 不可重复读&#xff09; ⅳ. 串行化 &#xff08;解决 脏读 不可重复读 幻读 问题 &#xff09; 隔离级别分类如下&#xff0c;在不同的隔离级别下可能产生不…

LabVIEW提高开发效率技巧----使用LabVIEW工具

LabVIEW为开发者提供了多种工具和功能&#xff0c;不仅提高工作效率&#xff0c;还能确保项目的质量和可维护性。以下详细介绍几种关键工具&#xff0c;并结合实际案例说明它们的应用。 1. VI Analyzer&#xff1a;自动检查代码质量 VI Analyzer 是LabVIEW提供的一款强大的工…

Python 之数据库操作(Python Database Operations)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

新书出版,大陆首本NestJS图书《NestJS全栈开发解析:快速上手与实践》

新书全栈实战项目&#xff1a;数字门店管理平台开源啦&#x1f389;&#x1f389;&#x1f389; GitHub地址&#xff08;持续更新NestJS企业级实践&#xff09;&#xff1a;欢迎star⭐️⭐️⭐️ 前端ReactTypeScriptVite 后端NestMySQLRedisDocker 前言 对&#xff0c;你没看…

esp32s3分区表配置及读写

一、分区表介绍 每片 ESP32-S3 的 flash 可以包含多个应用程序&#xff0c;以及多种不同类型的数据&#xff08;例如校准数据、文件系统数据、参数存储数据等&#xff09;。因此&#xff0c;在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。 分区表中的每个条目都包括以下…