Linux 操作系统中的管道与共享内存

目录

一、匿名管道

(一)基本概念

(二)关键现象

(三)管道特性

二、命名管道

(一)基本概念

(二)关键特性

三、共享内存

(一)基本概念

(二)关键函数

(三)共享内存的特点

(四)共享内存的生命周期

四、总结


在 Linux 操作系统中,管道和共享内存是两种重要的进程间通信(IPC)机制。本文将介绍 Linux 中的管道,包括匿名管道和命名管道,以及与共享内存相关的内容。

一、匿名管道

(一)基本概念

匿名管道是一种单向的数据通信通道,主要用于具有血缘关系的进程之间进行 IPC,通常在父子进程中使用。它由两个文件描述符fd[0](读端)和fd[1](写端)组成。

(二)关键现象

  1. 管道为空且管道正常,read 会阻塞:当管道中没有数据可读时,调用read函数的进程会被阻塞,直到有数据写入管道。
    • 例如,在一个父子进程通信的场景中,子进程负责从管道读取数据,如果管道为空,子进程会暂停执行,等待父进程写入数据。
  1. 管道为满且管道正常,write 会阻塞:管道有一定的容量上限,在 Ubuntu 中通常为 64KB。当管道已满时,调用write函数的进程会被阻塞,直到管道中有空间可供写入。
    • 假设一个进程不断向管道写入数据,当管道达到容量上限时,该进程会暂停,直到管道中的数据被读取,腾出空间。
  1. 管道写端关闭且读端继续,读端读到 0,表示读到文件结尾:当管道的写端被关闭时,继续从读端读取数据的进程会读到文件结尾的标志(0)。
    • 比如,父进程关闭了管道的写端,子进程在读取完管道中的所有数据后,会收到文件结尾的信号。
  1. 管道写端正常且读端关闭,OS 会直接杀掉写入的进程:如果管道的读端被关闭,而写端的进程继续写入数据,操作系统会发送信号终止该写入进程。
    • 这是为了防止进程在无法写入数据的情况下无限阻塞或出现错误行为。

(三)管道特性

  1. 面向字节流:数据以字节流的形式在管道中传输,没有固定的消息边界。
    • 这意味着写入和读取的数据可以是任意长度的字节序列,不像消息队列那样有明确的消息边界。
  1. 用于具有血缘关系的进程进行 IPC:通常在父子进程或有共同祖先的进程之间使用。
    • 例如,在一个 shell 命令管道中,多个命令通过管道连接,这些命令通常是由同一个 shell 进程启动的子进程。
  1. 文件的生命周期随进程,管道也是:当创建管道的进程结束时,管道也会被销毁。
    • 如果一个父进程创建了管道并启动了子进程进行通信,当父进程和子进程都结束时,管道将不再存在。
  1. 单向数据通信:管道只能在一个方向上传输数据,要么从写端到读端,要么从读端到写端。
    • 要实现双向通信,需要创建两个管道。
  1. 管道自带同步互斥等保护机制:管道内部实现了同步和互斥机制,确保数据的正确读写。
    • 当一个进程正在读取管道数据时,其他进程不能同时写入数据,反之亦然。

二、命名管道

(一)基本概念

命名管道是一种真正存在的文件,具有路径和文件名,具有唯一性。可以通过mkfifo函数创建命名管道,通过unlink函数删除命名管道。命名管道可以被多个没有血缘关系的进程访问,是一种公共资源。

(二)关键特性

  1. 读端打开文件时,写端还没有打开的时候,读端的 open 会阻塞:当一个进程以读方式打开命名管道时,如果没有其他进程以写方式打开该管道,读进程会被阻塞,直到有写进程打开管道。
    • 例如,在一个服务器 - 客户端模型中,服务器进程以读方式打开命名管道,等待客户端进程写入数据。如果没有客户端连接,服务器进程会一直阻塞。
  1. 文件会记录用户 UID,进程的 PCB 有 UID 就可以查看是拥有者所属组 other:命名管道文件与普通文件一样,记录了创建者的用户 ID(UID)和所属组等信息。进程可以根据自己的 UID 和权限来访问命名管道。
    • 这确保了命名管道的安全性和访问控制。

三、共享内存

(一)基本概念

共享内存是一种让两个进程在各自的用户空间共享内存块的 IPC 机制。它的通信速度非常快,但没有自带保护机制,需要用户自己通过信号量、命名管道等方式实现保护。

(二)关键函数

  1. shmget(key, size, shmflg):创建共享内存的函数。
    • key是用户输入的一个值,用于保障共享内存的唯一性。可以通过ftok函数生成唯一值,确保不同的进程能够看到同一个共享内存。
    • size是要创建的共享内存的大小。
    • shmflg是权限标志等参数。
  1. shmat:将共享内存挂接到进程的地址空间上。
    • 一旦共享内存被创建,进程可以使用shmat函数将其映射到自己的地址空间,以便直接访问共享内存中的数据。
  1. shmdt:去关联共享内存。
    • 当进程不再需要访问共享内存时,可以使用shmdt函数解除与共享内存的关联。

(三)共享内存的特点

  1. 通信速度最快:由于共享内存直接在进程的用户空间进行数据共享,不需要进行数据的复制和传递,因此通信速度非常快。
    • 相比其他 IPC 机制,如管道和消息队列,共享内存能够实现更高效的数据传输。
  1. 没有加任何保护机制:共享内存本身没有提供同步和互斥机制,需要用户自己实现保护。
    • 例如,可以使用信号量来控制对共享内存的访问,确保数据的一致性和完整性。
  1. 权限和文件一样:共享内存具有与文件类似的权限设置,可以通过shmget函数的参数来指定共享内存的权限。
    • 如果进程没有足够的权限,可能无法创建或访问共享内存。

(四)共享内存的生命周期

  1. 用户必须让 OS 释放
    • 指令释放:可以使用ipcrm -m +shmid命令删除共享内存,使用ipcs -m命令查看共享内存的状态。
    • 代码释放:可以使用shmctl函数来控制共享内存的状态,包括释放共享内存。
  1. 随内核:进程结束后,共享内存的生命周期随内核。如果没有被显式释放,共享内存可能会一直存在,直到操作系统重启。

四、总结

Linux 操作系统中的管道和共享内存是强大的进程间通信机制。匿名管道适用于具有血缘关系的进程之间的单向通信,具有自动的同步互斥保护机制。命名管道是一种真正的文件,可以被多个进程访问,实现了更灵活的 IPC。共享内存提供了最快的通信速度,但需要用户自己实现保护机制。在实际应用中,根据不同的需求选择合适的 IPC 机制,可以提高系统的性能和可靠性。

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

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

相关文章

Glide 加载图片并应用滤镜效果

https://chatgpt.com/share/675a5bf6-7cd8-8003-98e7-d86146e47e95 常用滤镜类型 颜色调整滤镜 灰度 (Grayscale): 将图片转换为黑白。 反色 (Invert): 将图片的颜色反转。 棕褐色 (Sepia): 应用棕褐色滤镜,营造复古效果。 色调 (Hue): 调整图片的主色调。 饱和度…

Python 参数配置使用 XML 文件的教程 || Python打包 || 模型部署

当配置项存储在外部文件(如 XML、JSON)时,修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数,无需更改源代码,从而提升开发效率和代码可维护性。 1. 为什么选择 XML 配置文件 XML 配置文件具有多种优点…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…

Android显示系统(13)- 向SurfaceFlinger提交Buffer

Android显示系统(01)- 架构分析 Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角…

【kubernetes】资源管理方式

目录 1. 说明2. 命令式对象管理3. 命令式对象配置4. 声明式对象配置5. 三种方式的对比 1. 说明 1.在Kubernetes(k8s)中,资源管理是一个核心功能,它允许用户通过操作资源来管理Kubernetes集群。2.Kubernetes将所有的内容都抽象为资…

【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge

文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1:git merge(保留分支结构)方法 2:git rebase(线性合并提交历史)直接在master分支执行git merge br_feature,再 执行 git pull --reba…

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构,可方便地与其他FMC板卡实现高速互联,可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…

实操给自助触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期,DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具,支持不同版式单据智能分类扩展,可选功能插件配置流程,满足多样业务场景。 随着全球化与信息化进程,企业的文件…

英伟达垄断?中国芯片如何破局?

近期,全球AI芯片巨头英伟达被曝遭遇中国反垄断调查,引发行业广泛关注。 【图片来源于网络,侵删】 众所周知,在人工智能的浪潮中,英伟达无疑是全球AI算力市场的领头羊。在芯片领域,尤其是 GPU 市场&#xff…

用户体验测试与专项测试常用工具

用户体验(User Experience, UX)测试关注的是用户在使用软件产品时的主观感受。这包括用户界面的易用性、交互设计的友好性以及整体的满意度。UX测试不仅能够帮助开发人员发现产品中的潜在问题,还能为企业提供改善产品体验的建议。 功能亮点 …

40 基于单片机的温湿度检测判断系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用dht11温湿度传感器检测温湿度, 通过lcd1602显示屏各个参数,四个按键分别可以增加温湿度的阈值, 如果超过阈值,则…

基于Matlab实现三维地球模型(源码)

利用MATLAB强大的图形处理能力和数学计算功能构建的可视化应用。这个模型允许用户在三维空间中观察地球,并且能够动态地旋转地球模型,同时还可以模拟卫星在其周围的运动轨迹,为学习地球科学、天文学以及航天工程等领域提供了一个直观的教学工…

JavaSe部分总结

我们先来了解一下Java语言,JavaSE是Java编程语言的标准版,主要是来学习Java的基本语法,书写方式,以及一些简单的逻辑循环和判断,包括一些关键字,特殊类(抽象类),特殊的方法(static修饰的方法,final修饰的方法)等等,最重要的是Java语言是比较C语言和C语言是比较简单的,Java是面向…

适用于 Windows 的 Podman

适用于 Windows 的 Podman 虽然“容器是 Linux”,但 Podman 也可以在 Mac 和 Windows 上运行,它提供原生 CLI 并嵌入来宾 Linux 系统来启动您的容器。此 guest 称为 Podman 计算机,并使用命令进行管理。在 Windows 上,每台 Podma…

Linux中 vim 常用命令大全详细讲解

文章目录 前言一、Vim 基本操作 🕹️1.1 打开或创建1.2 退出编辑1.3 模式切换 二、Vim 光标移动命令 ↕️2.1 基本移动2.2 行内移动2.3. 单词移动2.4. 页面移动2.5. 行跳转 三、Vim 文本编辑命令 📋3.1 插入和删除3.2 复制、剪切与粘贴3.3 替换与修改 四…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆,用以运送各种汽油、柴油、原油等油品,运输危险系数大,而且由于油罐车需要经常行驶在城区道路,为城市各个加油站点、企业工厂运输补充所需油料,因此也是危化品运输车辆的重点监测和管控对象…

联想至像M3070DW打印机连接手机方法

首先,按打印机上的“功能”键,上翻页翻到第4项“网络”按“OK”键进入; 点进去之后,再按下翻页翻到第3项“安装向导”,按“OK”键进入; 然后,选择我们要连接的WiFi并输入WiFi密码, 输…

双亲委派机制是Java类加载器的一种工作模式

双亲委派机制是Java类加载器的一种工作模式,确保了类加载的一致性和安全性。以下是对双亲委派机制的详细解析: 一、定义与工作原理 双亲委派机制(Parent Delegation Model)要求除了顶层的启动类加载器外,其余的类加载…

Qt 使用modbus协议

Qt 框架下 使用modbus协议 一,使用Qt原生的 QModbusClient ,比如QModbusTcpClient 1,因为modbus的读写 需要在同一个线程中,所以需要在主线程中利用moveToThread的方式,将业务逻辑封装到 子线程中。 2,m…