进程间通信之管道

无人机:DJI Matrice 200 Series_(13).行业应用案例分析 在前一节中,我们介绍了DJI Matrice 200系列无人机的基本硬件配置和性能参数。本节将通过具体的行业应用案例,分析如何利用DJI Matrice 200系列无人机进行二次开发,以满足不同行业的需求。 阅读详情

进程间通信之管道


进程间通信:

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核(操作系统),在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

wKioL1eNaCTjmkiaAAAarN8J6BE509.png-wh_50

本质:让不同的进程可以访问同一块系统资源。


实现方式:

一、最基本的进程间通信机制--管道(由pipe函数创建)

 

管道的实现机制 

在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:

 

(1)限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后再对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。

(2)读取进程时也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。

注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。


1、管道的结构:

在Linux中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个file结构指向同一个临时的VFS索引节点,而这个VFS索引节点又指向一个物理页面而实现的。如下图所示:

wKioL1eNaPuQpljkAACa0Cx8ULs732.png-wh_50

上图中两个 file 数据结构,但它们定义文件操作例程地址是不同的,其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。


2、管道的读写

管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie()。管道写函数通过将字节复制到VFS索引节点指向的物理内存而写入数据,而管道读函数则通过复制物理内存中的字节而读出数据。当然,内核必须利用一定的机制同步对管道的访问,为此,内核使用了锁、等待队列和信号。

当写进程向管道中写入时,它利用标准的库函数write(),系统根据库函数传递的文件描述符,可找到该文件的file结构。file结构中指定了用来进行写操作的函数(即写入函数)地址,于是,内核调用该函数完成写操作。写入函数在向内存中写入数据之前,必须首先检查VFS索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作:

· 内存中有足够的空间可容纳所有要写入的数据;

· 内存没有被读程序锁定。

如果同时满足上述条件,写入函数首先锁定内存,然后从写进程的地址空间中复制数据到内存。否则,写入进程就休眠在VFS索引节点的等待队列中,接下来,内核将调用调度程序,而调度程序会选择其他进程运行。写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤醒。

管道的读取过程和写入过程类似。但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可以休眠在索引节点的等待队列中等待写入进程写入数据。当所有的进程完成了管道操作之后,管道的索引节点被丢弃,而共享数据页也被释放。

因此管道的实现涉及很多文件的操作。

获取Linux 内存页(基页)大小的命令:getconf  PAGE_SIZE ,一般的输出是4096,即 4KB。

wKioL1eNaZWQY6FhAAAK6kiK7UE649.png-wh_50


    管道创建后如何实现两个进程间的通信(比如如下实现步骤)

 实现步骤:

 1、父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。如下图:

wKioL1eNahygULrdAABpcjqOLpE626.png-wh_50


 2、父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。如下图:

wKiom1eNaleBkZMtAADDAe_jXIA979.png-wh_50

 3、父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。如下图:

wKioL1eNatSzInNKAAC0SEdRYuU953.png-wh_50

演示代码:

wKioL1eNaybBkKd-AABnE9no6CQ731.png-wh_50

wKiom1eNazrigT1sAAA0MWPz1Fg571.png-wh_50


   管道的特点:

    1、管道只允许具有血缘关系的进程间通信,如父子进程间的通信。

    2、管道只允许单向通信。

    3、依赖文件系统

    4、面向字节流

    5、管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。


管道的容量

测试代码如下图:

wKioL1eNbBPBYiMHAABmwH98fsA771.png-wh_50

wKiom1eNbBOj_nkuAAA__WLhC2Q980.png-wh_50

    运行结果如下:

wKioL1eNbGHgrwN4AAAGuUswnQ8478.png-wh_50

    由运行结果可得,管道容量约为64KB。


注意管道以下的四种特殊情况:


    1、写端关闭,读端继续,当把管道中剩余的数据读完,再次read将返回0,就像读到文件末尾一样。

wKiom1eNbTrABQfAAABaRyV2pzc696.png-wh_50

wKiom1eNbTujBq3lAABTnqG55rk731.png-wh_50

2、写端不关,且写端不写,读端继续,当管道中剩余的数据都被读取后,再次read将被阻塞,直到管道中有数据可读了才读取数据并返回。

wKioL1eNbsLAMftbAAA4GjU8UwE554.png-wh_50

3、读端关闭,进程向管道的写端write,那么进程会收到信号SIGPIPE,导致进程异常终止。

wKiom1eNb1KQU9S9AABQx--hVSU271.png-wh_50


4、读端不关且读端不读,写端继续,管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。

wKioL1eNc67Srr9CAABZLEc0RUw750.png-wh_50


本文出自 “缘去即成幻” 博客,谢绝转载!

ChatGPT充值,银行卡被拒绝,图文教程 ChatGPT充值,银行卡被拒绝 阅读详情

相关推荐

AXI Timer IP核使用说明

AXI Timer是提供定时技术功能的集成IP核,具有时间生成、事件捕获、产生PWM波以及产生中断的功能,下面具体讲述Timer IP核的使用说明。

weixin_43418104的博客 2488

进程间通信(IPC机制)——管道

一.管道的介绍 二.有名管道 1. 有名管道的创建: 2. 有名管道的使用举例: 三.无名管道 1.无名管道的创建 2.无名管道的使用举例 四.管道的实现 五.相关面试题

Mi-ronin的博客 1079

制造业信息化的现实困局与未来展望:从基础到数字化的挑战与机遇

随着全球科技的发展和市场竞争的加剧,制造业的转型升级成为企业必须面临的挑战。在信息化和数字化的浪潮下,许多企业试图通过技术创新来提升自身竞争力。然而,现实情况是,绝大部分制造业企业的基本信息化都尚未完成,更遑论复杂的数字化。那么,制造业在信息化进程中面对哪些阻碍?未来又该如何实现从基础信息化到数字化的转型?

Yz2024的博客 2983

Linux笔记(17)-进程间通信(管道)

IPC:InterPocess Communication(进程间通信) 1. 进程间通信常用方式: a. 管道 -- 简单 b. 信号 -- 系统开销小 c. 共享映射区 -- 有无血缘关系的进程间都可以通信 d. 本地套接字 -- 稳定 除此之外还可以使用文件等来进行通信...

I'm here 255

Jetson Orin NX上PyTorch环境搭建与性能优化指南

本文详细指导如何在Jetson Orin NX上搭建高效的PyTorch开发环境。内容涵盖CUDA与cuDNN的“隐藏”配置、Miniconda虚拟环境管理、PyTorch for Jetson的正确安装与验证,并提供了电源模式设置、TensorRT加速、混合精度等关键性能优化实战技巧,帮助开发者充分释放边缘AI设备的算力。

weixin_29090089的博客 338

强化学习代码实现PPO

梯度更新:通过截断(clipping)限制策略更新幅度,避免策略变化过大影响稳定性。首先是数据预处理,将相关数据(状态、采取的动作、状态奖励、下一个状态)放到gpu上。根据当前状态 state,利用策略网络生成每个动作的概率分布 probs。2. 修改了策略模型的输出,从每个动作的概率分布变成了动作的均值和方差。1. 修改了动作空间,离散空间变成了连续空间,使用正太分布来采样。3. 修改了动作的ratio的计算,从离散分布变成了正太分布计算。Update函数:通过经验缓冲数据来优化策略模型和价值模型。

wlxsp的博客 635

管道通信详解

管道是进程间通信的一种方式。进程间通信的方式:匿名管道命名管道System VSystem V 消息队列System V 贡献内存System V 信号量POSIX IPC消息队列共享内存信号量互斥量条件变量读写锁我们把一个进程连接到另外一个进程的数据流成为一个“管道”Linux中的|就是管道。

qq_64484137的博客 3998

手把手教你用ROS和Gazebo搭建Unitree A1机器狗仿真环境(含URDF/Xacro详解)

本文详细介绍了如何使用ROS和Gazebo搭建Unitree A1机器狗的仿真环境,涵盖URDF/Xacro文件编写、Gazebo物理引擎集成及ROS控制实现。通过实战指南,帮助开发者掌握四足机器人仿真技术,提升开发效率。

bush的博客 279

【Linux】进程通信之管道通信详解

详细介绍管道通信的概念和原理、管道通信的实现和应用、管道通信的优化和问题

阿润菜菜的博客 8821

CMOS Sensor的调试经验分享

我这里要介绍的就是CMOS摄像头的一些调试经验。 首先,要认识CMOS摄像头的结构。我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头、感应器和图像信号处理器构成。一般情况下,集成好的模组我们只看到外面的镜头、接口和封装壳,这种一般是固定焦距的。有些厂商只提供芯片,需要自己安装镜头,镜头要选择合适大小的镜头,如果没有夜视要求的话,最好选择带有红外滤光的镜头,因为一般的sensor都...

camerall 3764

涨点神器:基于YOLOv8的SPD-Conv小目标检测实战教程——让低分辨率场景检测精度飙升

从代码修改到场景落地,每一步都围绕“提升检测精度”这个核心目标,而实际数据也证明了这项技术的强悍——它不是实验室里的花拳绣腿,而是能真正解决工业痛点的涨点神器。在实际场景中,比如无人机巡检的低分辨率航拍图中,对电线、小设备的检测,YOLOv8-SPD的漏检率降低了70%以上。落地时,只需将训练好的YOLOv8-SPD模型部署到边缘设备或云端,即可享受其在小目标、低分辨率场景下的强大性能。的特征融合模块中,通过插入SPD-Conv,让模型在处理小目标时,既能保留空间细节,又能增强通道维度的特征表达。

m0_71589036的博客 157

【Linux】进程间通信——管道

【Linux】进程间通信——管道

weixin_60478154的博客 3734

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6819

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

进程间通信-1,进程间通信的目的,什么是管道,管道的原理,匿名管道,基于管道实现一个进程池。

2301_77509762的博客 4507

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Linux】基于管道进行进程间通信

介绍进程间通信的概念,认识基于管道进行进程间通信,认识匿名管道和命名管道,基于管道简单实现进程池!在进程池中加入日志函数!

YoungMLet的博客 3334

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

进程间通信——管道

文章目录进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道什么是管道匿名管道实例代码用fork来共享管道原理站在文件描述符角度-深度理解管道站在内核角度-管道本质管道读写规则命令行中的 `|` 管道中,进程间是兄弟关系管道特点命名管道创建一个命名管道匿名管道与命名管道的区别命名管道的打开规则用命名管道实现server&client通信 进程间通信介绍 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个

aaaaaaaWoLan的博客 2874

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

十一、进程间通信——管道

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括匿名管道和命名管道)、消息队列、信号量、共享内存等。进程间通信的本质就是,让不同的进程看到同一份资源。由于各个运行进程之间具有独立性,这个独立性主要体现在数据层面,而代码逻辑层面可以私有也可以公有(例如父子进程),因此各个进程之间要实现通信是非常困难的。

weixin_54447296的博客 3357

Linux 进程间通信(管道)

进程间通信、匿名管道、命名管道 ...

2201_75663820的博客 2734

深入了解linux系统—— 进程间通信之管道

进程间通信与管道 进程间通信(IPC)是指在同一台计算机或不同计算机上的进程之间进行数据交换的技术。由于进程具有独立性,必须通过操作系统提供的共享资源实现通信。常见的IPC方式包括管道、共享内存、消息队列、信号/信号量以及套接字。 管道分为匿名管道和命名管道。匿名管道通过pipe()系统调用创建,适用于父子进程间的单向通信。其本质是一个由操作系统维护的无名文件,父子进程通过继承文件描述符访问同一资源。代码示例展示了子进程写入、父进程读取的通信过程,验证了管道的数据传输功能。 管道通信存在四种典型情况:单向读

LH__1314的博客 1628

Linux之进程间通信(管道)

什么是管道?1、管道是Unix中最古老的进程间通信的形式。2、我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。管道只能进行单向通信,用来传输资源:数据。我们按下面的步骤来分析:1、首先,父进程分别以读和写的方式,打开了一个文件。2、然后,父进程fork创建了一个子进程,我们知道,子进程会继承父进程,指向同一个文件。3、我们规定,父进程对文件写入,子进程对文件读取。关闭父子进程各自不需要的功能。即:父进程关闭读的文件描述符,子进程关闭写的文件描述符。

zdlynj的博客 3006

【进程间通信】管道和命名管道

一个文件被打开了两次,因为他们打开的方式不一样,所以他们的标记为也一定不一样,它们在内存中的file结构体一定是存在两份的,但是文件的属性和操作集合都是一样的,所以文件属性和操作集合以及文件缓冲区是存在一份的,每个file结构体中会有一些基本的属性(读写位置等等),其次还会有一些指针,分别指向自己的属性和方法集合以及缓冲区。我们可以看到fd数字是一个文件描述符数组,所以Linux管道是复用了很多文件部分的代码的,所以在通信的时候很多还是文件的操作。管道是Unix中最古老的进程间通信的形式。

bushibrnxiaohaij的博客 1446

【进程间通信:管道】

Linux中管道如何构建?如何正常使用管道通信?以及使用管道通信时一些不容易被发现的Bug?

m0_68872612的博客 1315

管道实现进程间通信之命名管道

管道通信之命名管道

xbhinsterest11的博客 1055
上一篇: linux中make命令的简单使用以及Makefile文件的书写
下一篇: linux下信号量及其SEM_UNDO标志
Comedly
博客等级 码龄10年 17粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值