Linux环境管道通信介绍

news2025/7/27 16:15:54

目录

前言

一、通信的本质

二、匿名管道

1.通信资源——文件缓冲区

2.为什么叫匿名管道?

​编辑

3.匿名管道的创建过程

4.pipe函数

小结

5.一些问题

1)匿名管道为什么要求父子进程将原本的读/写权限只保留一个

2)为什么一开始父进程要以读/写打开文件

三、命名管道

1.mkfifo函数

2.创建命名管道文件而不用普通文件的原因

3.有关管道的一些细节

1)管道为什么叫管道

2)在通信过程中,创建的管道文件大小不变的原因

3)管道两端读写速度不匹配的情况

4)管道的特征

总结



前言

首先,什么是通信呢?

①进程间的数据传输;②进程间的信息通知;③一个进程控制另一个进程(如gdb调试)。

为什么要有进程间的通信?

在实际应用中常需要多进程协调,如

cat file | grep 'name'

怎么实现通信?

可以通过管道实现进程间的通信。


一、通信的本质

由于进程具有独立性,故想要使独立的进程能够通信需要满足以下条件:

1.OS需要直接或者间接给通信双方的进程提供额外的“内存空间”;

2.需要让通信双方进程都能同时看到这份OS提供的额外“资源”。

由于OS提供的这份资源的不同,可以划分为不同的通信方式

二、匿名管道

怎么样才能使得两个进程能同时看到系统提供的资源呢?

匿名管道通过利用“子进程会继承父进程的部分属性信息”的特性,以实现父子进程间的通信。

1.通信资源——文件缓冲区

当父进程打开某个“文件”后,在创建一个子进程,该子进程一定继承了位于父进程PCB(task_strutc)中的文件描述符表struct file* fd_array[ ],那么此时父子进程便可以访问同一份文件。

每个文件在被打开后,操作系统为方便管理这些被打开的文件会为其创建file结构体对象,而file中都有着缓冲区。

于是父子进程能够同时访问的这个文件的缓冲区就能够成为进程通信的一种资源。

2.为什么叫匿名管道?

换句话说,并非真的需要父子进程同时打开磁盘中的某一个文件,只需OS在内存中创建一个file专门用于通讯即可。所以管道文件不会进行磁盘刷新。

(实际上file结构体中有个联合体成员,专门用于表示该file指向的文件是普通文件还是管道文件)

3.匿名管道的创建过程

1)父进程通过pipe函数创建管道

父进程通过pipe函数,分别用读和写的方式打开同一个文件。

2)父进程fork创建出子进程

由于子进程会继承父进程的一部分内容属性,故此时这个管道文件同时被两个进程分别以读和写的方式指向。

3)根据实际需要,父进程关闭读端,子进程关闭写端,或者父进程关闭写端,子进程关闭读端。

这样这个管道文件便就变成了,一端进程在往里写数据,另一个进程在另一端读数据。

4.pipe函数

作用:创建一个内存级文件,用于管道通信。

参数:该参数为输出型参数,OS将创建好的文件以读写方式打开,并通过传入的数组参数返回读写两个操作的文件描述符。返回的数组,其中0下标元素存储的是读文件描述符,1下标的是写文件描述符。

返回值:成功返回0,失败返回-1.

小结

父进程通过pipe系统调用以读写方式打开一个内存级文件。然后通过创建子进程并使得子进程继承对该进程的读写方式后,再根据实际需要关闭父子进程的读或写端,进而形成一条单向的通信信道。这条信道是基于文件的,故被称为管道文件。

5.一些问题

1)匿名管道为什么要求父子进程将原本的读/写权限只保留一个

2)为什么一开始父进程要以读/写打开文件

三、命名管道

上面的匿名管道有个使用前提是:通信双方需是具有“血缘”关系的进程,如父子进程。那没有“血缘”关系的两个进程应该如何通信呢?

同理,只要我们让两个欲通信的进程双方看到同一份资源,即可实现“无血缘关系”的进程间通信

1.mkfifo函数

作用:mkfifo函数可以在指定的路径创建一个命名管道文件。

参数:第一个参数是希望创建的命名管道文件所在路径,第二个参数是初始化命名管道文件权限。

返回值:成功返回0,失败返回-1.

命名管道是如何做到让不同的进程,看到同一份资源的?

路径 + 文件名 = 唯一性,可以让不同的进程打开指定名称(路径+文件名)的同一份文件。

2.创建命名管道文件而不用普通文件的原因

3.有关管道的一些细节

①管道一般都是单项的,用于数据的单项通信;

②管道必须要有入口和出口——读端和写端;

1)管道为什么叫管道

2)在通信过程中,创建的管道文件大小不变的原因

无论是匿名管道还是命名管道,其本质是一个内存级的缓冲区,没有向外设如磁盘中IO,故管道文件的大小没有发生变化。

3)管道两端读写速度不匹配的情况

①读慢写快:由于管道文件所能容纳的数据也是有上限的(默认大小通常为64KB,具体大小可能因系统而异),故管道会被写端写入的数据填满,此时OS会阻塞写端进程,等待读端读取数据,直到管道中有着剩余空间。

②读快写慢:读端在读,但管道中没有数据,此时OS也会将正在读取的进程阻塞,等待写端写入数据。

③特殊情况:

a.当写端进程关闭后,读端会读到0;

b.当读端进程关闭,OS会给写端进程发送信息,终止写端。

4)管道的特征

1)管道的生命周期由读写进程决定,若两个进程都关闭了读写,则管道的生命也就结束了。

2)匿名管道可以在具有“血缘关系”的进程间进行通信,常用于父子进程通信。

3)管道是面向字节流的,即管道不在乎两个进程通信的是数字还是字符串,管道中流动的永远是字节。

4)管道是半双工的——单向通信。

5)管道读和写操作可以同时进行(并发)。写/读操作不需要等待读/写操作完成(只要缓冲区未满)。管道通过内核缓冲区实现读写并发,只要缓冲区既不满也不空,读写操作就能同时进行


总结

本文讨论了管道通信的原理和相关函数的用法。

本文先从进程通信的本质“让通信双方看到同一份资源”入手,再通过匿名管道的原理和创建过程深入理解管道通信的原理,最后介绍了命名管道以及有关管道的一些细节。

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

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

相关文章

DIC技术助力金属管材全场应变测量:高效解决方案

在石油管道、汽车排气系统、航空航天液压管路等工业场景中,金属管作为关键承力部件,其拉伸性能(如弹性极限、颈缩行为、断裂韧性)直接影响结构安全性和使用寿命。 实际应用中,选用合适的管材非常重要,通过…

嵌入式学习--江协stm32day1

失踪人口回归了,stm32的学习比起51要慢一些,因为涉及插线,可能存在漏插,不牢固等问题。 相对于51直接对寄存器的设置,stm32因为是32位修改起来比较麻烦,江协课程是基于标准库的,是对封装函数进…

湖北理元理律师事务所:债务化解中的心理重建与法律护航

专业法律顾问视角 一、债务危机的双重属性:法律问题与心理困境 在对173名债务人的调研中发现: 68%存在焦虑引发的决策障碍(如不敢接听银行电话) 42%因羞耻感隐瞒债务导致雪球效应 湖北理元理律师事务所创新采用法律-心理双轨…

【更新中】(文档+代码)基于推荐算法和Springboot+Vue的购物商城

概要设计 本节规划和定义了Woodnet桌游电商平台的软件概要设计说明书,描述了软件的总体设计、接口设计、运行设计、系统数据库结构设计以及系统出错处理设计,从整体上说明了系统设计的结构层次、处理流程、系统用例等。 本系统是一个独立的系统&#x…

六种高阶微分方程的特解(原创:daode3056)

高阶微分方程的通解是指包含所有可能解的解的表达式。对于一个 n 阶微分方程,其通解通常包含 n 个任意常数。这些任意常数可以通过初始条件或边界条件来确定。高阶微分方程的特解是指在通解中,特定地选择了一组常数,使得解满足给定的初始条件…

【C++11(上)】—— 我与C++的不解之缘(三十)

一、C11 这里简单了解一下C发展好吧: C11是C的第二个大版本,也是自C98以来最重要的一个版本。 它引入了大量的更改,它曾被人们称为C0x,因为它被期待在2010年之前发布;但在2011年8月12日才被采纳。 C03到C11花了8年时间…

【多线程初阶】wait() notify()

文章目录 协调多个线程间的执行顺序join 和 wait 区别sleep 和 wait 区别 wait()方法线程饿死调用 wait()唤醒 wait() notify()方法wait() 和 notify() 需对同一对象使用确保先 wait ,后 notify多个线程在同一对象上wait notify随机唤醒一个wait notifyAll()方法应用 wait() 和…

安全-JAVA开发-第二天

Web资源访问的流程 由此可见 客户访问JAVA开发的应用时 会先通过 监听器(Listener)和 过滤器(Filter) 今天简单的了解下这两个模块的开发过程 监听器(Listener) 主要是监听 我们触发了什么行为 并进行反应…

Python基础:文件简单操作

🍃引言 手把手带你快速上手Python Python基础专栏 一、🍃文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失。 要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在文件中保存。 通过文件的后缀名, 可以看…

深度学习项目之RT-DETR训练自己数据集

RT-DETR 1.模型介绍📌 什么是 RT-DETR ?📖 核心改进点📊 结构示意🎯 RT-DETR 优势⚠️ RT-DETR 缺点📈 应用场景📑 论文 & 官方仓库2.模型框架3.Yaml配置文件4.训练脚本5.训练完成截图6.总结…

以太网帧结构和封装【二】-- IP头部信息

1字节 byte 8比特 bit 【位和比特是同一个概念】 比特/位,字节之间的关系是: 位(Bit) 中文名:位(二进制位)。 英文名:Bit(Binary Digit 的缩写)。 含义&…

Promtail采集服务器本地日志存储到Loki

✅ 一、前提条件 已安装 Loki 服务 日志文件目录可访问(如 /var/log) 具备 sudo 权限 🧩 二、下载 Promtail 二进制文件 # 替换为你想要的版本 VERSION"3.5.1"# 创建目录 sudo mkdir -p /opt/promtail cd /opt/promtail# 下载并…

学习STC51单片机27(芯片为STC89C52RCRC)

每日一言 你读过的书、走过的路、流过的汗,终将成就独一无二的你。 硬件:LCD1602液晶显示 非标协议外设 概述 LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 1602 即 32 字符(16列两行) 那我…

DA14531_beacon_大小信标设备开发

蓝牙信标是一款通过广播指定蓝牙信号,实现信标信号扫描、识别和获得辅助信息的电子产品。 不同品名的蓝牙信标采用相同的 UUID 和广播信号格式,但在 MAC 地址、工作寿命、体积和广播周期上有所差异。 小武编程巧用DA14531开发一款蓝牙信标.

【算法训练营Day06】哈希表part2

文章目录 四数相加赎金信三数之和四数之和 四数相加 题目链接:454. 四数相加 II 这个题注意它只需要给出次数,而不是元组。所以我们可以分治。将前两个数组的加和情况使用map存储起来,再将后两个数组的加和情况使用map存储起来,ke…

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况: 公式文献 等我下学期有时间了,一定要学习Latex啊,word写英文论文,不论是排版还是公式都很麻烦的,而Latex一键就…

乡村三维建模 | 江苏农田无人机建模案例

测绘是农田建设的基础工作,测绘的质量和效率直接影响农田建设的进度和成果。传统的人工测量、地面测量等测绘手段,存在效率低、精度差、受环境影响大、成本高等缺点,难以满足高标准农田建设的要求。而无人机倾斜摄影技术具有高效、精确、灵活…

2025 5 月 学习笔记

计算高斯半径,用于生成高斯热图 这个的意义是什么 有什么作用? 14 核心意义:平衡定位精度与检测鲁棒性 在基于热图的目标检测方法(如CenterNet、CornerNet等)中,计算高斯半径的核心意义在于​​在精确…

SpringBoot(七) --- Redis基础

目录 前言 一、Redis入门 二、Redis常用数据类型 三、Redis常用命令 1. 字符串操作命令 2. 哈希操作命令 3. 列表操作命令 4. 集合操作命令 5. 有序集合操作命令 6.通用命令 四、在Java中操作Redis 前言 Redis是一个基于内存的key-value结构数据库,有以下…

从OSI到TCP/IP:网络协议的演变与作用

个人主页:chian-ocean 文章专栏-NET 从OSI到TCP/IP:网络协议的演变与作用 个人主页:chian-ocean文章专栏-NET 前言网络发展LANWAN 协议举个例子: 协议的产生背景 协议的标准化OSI模型参考OSI各个分层的作用各层次的功能简介 TCP/…