当前位置: 首页 > article >正文

【Linux】进程间通信(一):认识管道

📝前言:

这篇文章我们来讲讲进程间通信——认识管道

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


这里写目录标题

  • 一,认识进程通信
    • 1. 进程间通信的意义
    • 2. 进程通信本质
  • 二. 匿名管道
    • 1. 认识管道
    • 2. 匿名管道原理
    • 3. 使用示例
      • pipe
      • 示例
    • 4. 五种特性
    • 5. 四种通信情况
    • 6. 其他小知识

一,认识进程通信

1. 进程间通信的意义

我们都知道进程间具有独立性,那如果我们想要让进程间协作,就涉及到进程间通信。

进程间通信的目的:

  • 数据传输:⼀个进程需要将它的数据发送给另⼀个进程
  • 资源共享:多个进程之间共享同样的资源。
  • 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知⽗进程)。
  • 进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。

2. 进程通信本质

  • 进程间通信的本质是:先让不同的进程看到同一份资源[ “内存”](然后才有通信条件)
  • 同一份资源:不能由任何一个进程提供(因为进程具有独立性,写时会发生写时拷贝),必须由OS提供。
  • 既然是由OS提供,就必须有对应的系统调用(而这个通信接口具有统一的设计标准)

二. 匿名管道

1. 认识管道

管道是单向的通信通道,我们把从一个进程连接到另一个进程的一个数据流称为⼀个“管道”

在这里插入图片描述

2. 匿名管道原理

  • 匿名管道是基于内存级文件实现的(即:这个文件不涉及缓冲区往磁盘的刷新)【因为这个文件是内存级的,所以叫匿名】
  • 通过系统调用pipe,打开管道文件(这是一个可读,可写的文件),会返回两个文件描述符fd(一端是读,一端是写,通常fds[0]:读段,fds[1]:写端)
  • 子进程继承父进程的文件描述表,就会和父进程同时指向一个管道文件【即:父子进程看到同一个文件缓冲区,这就是管道】
  • 再关闭子进程的一个端和父进程的一个端(如父进程关写端,子进程关读端),就实现了一个父读子写的单向通信

文件描述符角度看管道:
在这里插入图片描述

3. 使用示例

pipe

在这里插入图片描述

  • 打开一读一写端口
  • 因为是内存级文件,所以不需要传入要打开的文件的路径和名称
  • pipefd[2]:为输出型参数,返回两个fdpipefd[0]:读端,pipefd[1]:写端

示例

#include <stdio.h>
#include <unistd.h>
#include <cstring>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{// 让子进程写,父进程读int fds[2];if(pipe(fds) == -1){perror("make pipe");exit(1);}char buffer[100];int id = fork();if (id == 0){int i = 0;// childclose(fds[0]); // 子进程把读端口关了while (true){snprintf(buffer, sizeof(buffer), "我是子进程, PID: %d, 信息序列: %d\n", getpid(), ++i);write(fds[1], buffer, strlen(buffer)); // strlen不计算 \0sleep(1);}exit(0);}// fatherclose(fds[1]); // 把写端口关了// waitpid(id, nullptr, 0);while(true){// 清空缓冲区memset(buffer, 0, sizeof(buffer)); // 同时也进行了 \0 的设置int bytes = read(fds[0], buffer, sizeof(buffer) - 1); // 预留空间给 \0printf("父进程读取成功 (%d 字节): %s\n", bytes, buffer);sleep(1);}return 0;
}

运行结果:
在这里插入图片描述
可见:匿名管道适用于父子进程,且父进程来打开管道文件,这样子进程继承父进程的文件描述表,才能和父进程看到同一个文件

4. 五种特性

  1. 匿名管道,只能用来进行具有血缘关系的进程进行进程间通信(常用于父子)
  2. 管道文件自带同步机制
  3. 管道是面向字节流的
  4. 管道是单向通信的
  5. (管道)文件的声明周期是随进程的

下面我依次简单说明一下:

  • 第一点:子进程继承父进程文件描述符表(不多说了)
  • 第二点:同步怎么理解?
    • 对于普通文件(比如stdout),父子进程同时往显示器上写是不会相互影响的,都能写出来
    • 但是对于管道(假如是:子写父读,且写慢,读快),则父进程要等子进程写完,才能读到数据
  • 第三点:暂时不做解释
    • 提一下:写快,读慢的时候,读这一行为不依赖与写的行为,而是由读自己决定的(自己读几个字节,怎么读),和曾经怎么写没有必然关系。【所以这时候读是面向字节流的】
  • 第四点:单向通信(半双工的一种特殊情况)
    • 半双工:任意时刻,只能一读,一写【可能两边都可以读写,只是强调任意时刻,每边只能有一个行为】
    • 全双工:任意时刻,两边可以同时读写
  • 第五种:当我们打开一个文件后,在进程结束前,没有close(fd),进程退出时,会自动把对应文件的引用计数--

5. 四种通信情况

感兴趣的可以自己做测试,这里就不做了。

  • 写慢,读快 → 读端要阻塞【等待写端】
  • 写快,读慢 → 写满了缓冲区的时候,写端要阻塞【等待读端】
  • 写关,继续读 → 把缓冲区读完以后,读不到信息了就会read返回0,即:读到文件结尾了
  • 写继续,读关 → 此时写入的行为是没有意义的,OS会杀掉进程【发送异常信号 13】(因为OS本来就是管理资源的,这种没有意义的行为在浪费资源)

6. 其他小知识

  • 管道容量:管道是文件,缓冲区也有容量(不同操作系统的管道容量可能不同)
  • 管道写入有原子性【当写入数据的大小不超过缓冲区大小时】:即,要么不写,要么写完。如:写入hello world,不会出现只写入了一半hello,然后把world丢掉的情况

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

【Linux】进程间通信(一):认识管道

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲进程间通信——认识管道 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础&a…...

中大型水闸安全监测系统解决方案

一、方案概述 中大型水闸作为水利工程的重要组成部分&#xff0c;承担着调节水位、控制水流、防洪排涝等多重功能&#xff0c;在防洪减灾、水资源配置、生态环境改善等方面发挥着巨大作用。然而&#xff0c;由于历史原因&#xff0c;许多水闸存在建设标准偏低、质量较差、配套设…...

蓝桥杯12届国B 123

题目描述 小蓝发现了一个有趣的数列&#xff0c;这个数列的前几项如下&#xff1a; 1,1,2,1,2,3,1,2,3,4,⋯ 小蓝发现&#xff0c;这个数列前 1 项是整数 1&#xff0c;接下来 2 项是整数 1 至 2&#xff0c;接下来 3 项是整数 1 至 3&#xff0c;接下来 4 项是整数 1 至 4&…...

Harmony开发 List、Grid拖动自定义排序实现

1. Harmony开发 List、Grid拖动自定义排序实现 1.1. List拖动功能 本示例基于显式动画、List组件实现了ListItem的上下拖动、ListItem切换以及ListItem插入的效果。   实现思路:List手势拖动 @Entry @Component struct ListDragPage {@State private arr: string[] = [0, …...

迅龙3号基于兆讯MH22D3适配CST328多点触摸驱动开发笔记

MH22D3芯片是兆讯公司新推出的基于cortex-M3内核的新一代芯片&#xff0c;专注于显示应用&#xff0c;其主频高达216Mhz&#xff0c;64KB SRAM&#xff0c;512KB Flash&#xff0c;开发UI应用游刃有余。详细介绍请看&#xff1a;MH22D3新一代显控应用性价比之王 新龙微基于MH22…...

【001】.so文件分析之 ELF格式符号

.so 文件的结构标识主要依据 ELF 格式&#xff08;Executable and Linkable Format&#xff09; 一个 .so 文件其实是一个 ELF&#xff08;可执行与可链接格式&#xff09; 文件&#xff0c;里面包含多个结构标识符和段&#xff08;Sections&#xff09;用于支持动态加载、符号…...

QT之LayOut布局

文章目录 QFormLayoutQGridLayoutQFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例用QFormLayout 代替 界面左边部分的QGridLayout QFormLayout #include "widget.h"#include <QFormLayout> #include <QLineEdit>Widget::Widget(QWidget *p…...

无需配置光猫,使用网管交换机配合路由器的IPTV功能实现单线复用

一、背景 弱电箱和电视柜只预留了一根网线&#xff0c;路由器放在电视柜&#xff0c;想实现既可以上网又可以正常观看iptv&#xff0c;本文提供了一种方法。 二、准备工作 1、带iptv功能的路由器&#xff1b;2、水星sg105pro网管交换机&#xff1b;3、网线若干&#xff1b; …...

C++类与对象--1 特性一:封装

C面向对象三大特性&#xff1a; &#xff08;1&#xff09;封装&#xff1b;&#xff08;2&#xff09;继承&#xff1b;&#xff08;3&#xff09;多态&#xff1b; C认为万物皆是对象&#xff0c;对象上有对应的属性&#xff08;数据&#xff09;和行为&#xff08;方法&…...

Linux:计算机的层状结构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本、台式机。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系结构。 CPU&#xff1a;运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的…...

【SpringBoot】关于MP使用中配置了数据库表前缀的问题

problem 使用MP时&#xff0c;在application.yml配置文件中配置了MP匹配数据库表中的表名时的前缀作了规定&#xff0c;如下&#xff1a; 那么当我运行时报错了错误&#xff0c;报错信息如下&#xff1a; 因为我数据库表的书类表名是book&#xff0c;MP在匹配时使用了表名前…...

AI 赋能防艾宣传:从创意到实践,我的 IP 形象设计之旅

在数字技术飞速发展的今天&#xff0c;如何让严肃的健康传播变得更有温度、更具吸引力&#xff1f;作为一名参与防艾宣传实践的学生&#xff0c;我尝试通过 AI 工具构建专属 IP 形象&#xff0c;让防艾知识从 "被动接受" 转化为 "主动探索"。这篇文章将分享…...

Redis 事务与管道:原理、区别与应用实践

在现代分布式系统开发中&#xff0c;Redis 作为高性能的内存数据库&#xff0c;其事务处理和管道技术是开发者必须掌握的核心知识点。本文将深入探讨 Redis 事务和管道的实现原理、使用场景、性能差异以及最佳实践&#xff0c;帮助开发者根据实际需求选择合适的技术方案。 一、…...

每日算法刷题Day9 5.17:leetcode定长滑动窗口3道题,用时1h

9. 1652.拆炸弹(简单&#xff0c;学习) 1652. 拆炸弹 - 力扣&#xff08;LeetCode&#xff09; 思想 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用 接下来 k 个数字之和替换。如果 k < 0…...

手机打电话时如何将通话对方的声音在手机上识别成文字

手机打电话时如何将通话对方的声音在手机上识别成文字 --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;一&#xff09; 下一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;二&#xff09; 一、…...

重排序模型解读:gte-multilingual-reranker-base 首个GTE系列重排模型诞生

模型介绍 gte-multilingual-reranker-base 模型是 GTE 模型系列中的第一个 reranker 模型&#xff0c;由阿里巴巴团队开发。 模型特征&#xff1a; Model Size: 306MMax Input Tokens: 8192 benchmark 关键属性&#xff1a; 高性能&#xff1a;与类似大小的 reranker 模型…...

C++学习:六个月从基础到就业——C++11/14:列表初始化

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;列表初始化 本文是我C学习之旅系列的第四十三篇技术文章&#xff0c;也是第三阶段"现代C特性"的第五篇&#xff0c;主要介绍C11/14中的列表初始化特性。查看完整系列目录了解更多内容。 引言 在C11之前&a…...

SQL语句执行问题

执行顺序 select [all|distinct] <目标列的表达式1> AS [别名], <目标列的表达式2> AS [别名]... from <表名1或视图名1> [别名],<表名2或视图名2> [别名]... [where <条件表达式>] [group by <列名>] [having <条件表达式>] [ord…...

2025系统架构师---选择题知识点(押题)

1.《计算机信息系统安全保护等级划分准则》(GB 17859-1999)由低到高定义了五个不同级别的计算机系统安全保护能力。 第一级:用户自主保护级---通过隔离用户与数据实现访问控制,保护用户信息安全; 第二级:系统审计保护级---实施更细粒度的访问控制,通过审计和隔离资源确…...

flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...

flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志&#xff0c;具体哪一步有问题flutter run --verbose使用这个&#xff0c;运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果&#xff1a;图片、字体文件等没有在pubspec.yam…...

P5682 [CSP-J2019 江西] 次大值

P5682 [CSP-J2019 江西] 次大值 题目描述 Alice 有 n n n 个正整数&#xff0c;数字从 1 ∼ n 1 \sim n 1∼n 编号&#xff0c;分别为 a 1 , a 2 , … , a n a_1,a_2, \dots , a_n a1​,a2​,…,an​。 Bob 刚学习取模运算&#xff0c;于是便拿这 n n n 个数进行练习&…...

Elasticsearch 性能优化面试宝典

Elasticsearch 性能优化面试宝典 🚀 目录 设计调优 🏗️写入调优 ⚡查询调优 🔍综合设计 💎总结 📝设计调优 🏗️ 面试题1:索引设计优化 题目: 假设需要设计一个电商商品索引,日增数据量1TB,要求支持多维度查询(名称、分类、价格区间)。请说明索引设计的关…...

【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2

文章目录 一、前述二、不同的先验及代表性论文2.1 几何先验&#xff08;Geometric Prior&#xff09;2.2 生成式先验&#xff08;Generative Prior&#xff09;2.3 codebook先验&#xff08;Vector Quantized Codebook Prior&#xff09;2.4 扩散先验 &#xff08;Diffusion Pr…...

无监督学习在医疗AI领域的前沿:多模态整合、疾病亚型发现与异常检测

引言 人工智能技术在医疗领域的应用正经历着从辅助决策向深度赋能的转变。无监督学习作为人工智能的核心范式之一,因其无需大量标注数据、能够自动发现数据内在规律的特性,在医疗AI领域展现出独特优势。尤其在2025年,无监督学习技术在医疗AI应用中呈现出多模态整合、疾病亚…...

计算机操作系统概要

不谋万世者&#xff0c;不⾜谋⼀时。不谋全局者 &#xff0c;足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l&#xff1a;以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…...

C语言进阶-数组和函数

C语言 一、数组 一维数组 通过数组&#xff0c;可以一次性的分配多个同类型的连续存储区 语法&#xff1a; 类型 数组名字[元素个数]; 例&#xff1a;int arr[6]; arr占用内存6个整型大小的连续存储空间 注意&#xff1a; 通过下标可以区分数组的每个…...

图片通过滑块小图切换大图放大镜效果显示(Vue3)

图片通过滑块小图切换大图放大镜效果显示 实现目标&#xff1a; 显示一组图片列表&#xff0c;鼠标进入小图记录当下小图下标&#xff0c;通过小图下标在数组中对应图片显示到大图位置&#xff1b; 鼠标进入大图位置时&#xff0c;带动滑块移动&#xff0c;并将放大两倍的大图…...

[SSL]1Panel添加阿里云DNS账户

1 创建一个子用户 将得到的key和secret贴到1panel的DNS账户配置中 添加权限 即可用DNS账号申请SSL证书...

C语言编程中的时间处理

最简单的time 在C语言编程中&#xff0c;处理时间最简单的函数就是time了。它的原型为&#xff1a; #include <time.h> time_t time(time_t *_Nullable tloc);返回自从EPOCH&#xff0c;即1970年1月1日的零点零时零分&#xff0c;到当前的秒数。 输入参数可以是NULL。…...

计算机网络 : 网络基础

计算机网络 &#xff1a; 网络基础 目录 计算机网络 &#xff1a; 网络基础引言1. 网络发展背景2. 初始协议2.1 初始协议2.2 协议分层2.2.1 软件分层的好处2.2.2 OSI七层模型2.2.3 TCP/IP五层&#xff08;四层&#xff09;模型 2.3 TCP/IP协议2.3.1TCP/IP协议与操作系统的关系&…...