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

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 机制,可以提高系统的性能和可靠性。

相关文章:

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

目录 一、匿名管道 (一)基本概念 (二)关键现象 (三)管道特性 二、命名管道 (一)基本概念 (二)关键特性 三、共享内存 (一)基…...

恢复删除的文件:6个免费Windows电脑数据恢复软件

数据恢复软件可帮助您从众多存储设备中恢复损坏或删除的数据。您可以使用这些文件恢复软件来检索文件、文档、视频、图片等。这些应用程序支持多种标准文件格式,如 PNG、RTF、PDF、HTML、JPG、MP3 等。 经过超过 75 小时的研究,我分析了 25 最佳免费数据…...

linux网络编程 | c | select实现多路IO转接服务器

select实现多路IO转接服务器 基于该视频完成 15-select实现多路IO转接设计思路_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 select实现多路IO转接服务器1.思路&功能2.代码实现warp.hwarp.cmulti_select_sever.c运行图 3.代码解释(细节&#xf…...

基于前后端分离的食堂采购系统源码:从设计到开发的全流程详解

本篇文章,笔者将从系统设计到开发的全过程进行详解,帮助开发者和企业了解如何高效构建一套完善的食堂采购系统。 一、系统需求分析 在开发一套基于前后端分离的食堂采购系统前,必须对业务需求和功能模块进行详细分析,确保系统设…...

小程序自定义tab-bar,踩坑记录

从官方下载代码 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 1、把custom-tab-bar 文件放置 pages同级 修改下 custom-tab-bar 下的 JS文件 Component({data: {selected: 0,color: "#7A7E83",selectedColor: "#3…...

游戏引擎学习第52天

仓库 : https://gitee.com/mrxiao_com/2d_game 这节的内容相当多 回顾 在游戏中,实体被分为不同的类别:接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理,接…...

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

【HTML】根据不同域名设置不同的网站图标(替换 link 中 href 地址)

文章目录 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"x-ua-compatible" content"ieedge,chrome1" /><meta name"viewport" content"widthdevice-width&q…...

使用Navicat从SQL Server导入表数据到MySQL

在表上右键选择导入向导 选择ODBC 1.内输入ip即可&#xff0c;不需要端口号 一定要勾选允许保存密码 选择需要的表&#xff0c;下一步 根据需求&#xff0c;可修改表名、是否新建表 根据需求修改不同表的字段类型和长度 按需选择导入方式...

私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?

当云计算席卷而来&#xff0c;基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署&#xff08;On-premises&#xff09;和公有云部署&#xff08;Public Cloud&#xff09;之间&#xff0c;不断融合的混合IT&#xff08;Mixed IT&#xff09;形式成为最常见的企业级…...

牛客网 SQL1查询所有列

SQL1查询所有列 select id,device_id,gender,age,university,province from user_profile 每日问题 C 中面向对象编程如何实现数据隐藏&#xff1f; 在C中&#xff0c;面向对象编程&#xff08;OOP&#xff09;通过封装&#xff08;Encapsulation&#xff09;实现数据隐藏。…...

【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)

问题描述 根据操作手册正常拉取代码&#xff0c;然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…...

如何使用ERC404协议

ERC404 ERC404协议的性质 ERC404不是一个开发代码工具包,而是一种智能合约标准规范。它就像是一份蓝图或者规则手册,规定了在以太坊区块链上开发特定智能合约应该遵循的接口、函数和事件等规则。如何使用ERC404协议 定义合约接口 首先,在开发智能合约时,要根据ERC404标准定…...

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

ORACLE RAC ADG备库报错ORA-04021: timeout occurred while waiting to lock object

问题&#xff1a;核心的灾备 RAC ADG 备库&#xff0c;这两天频繁重启&#xff0c;并且报如下错误&#xff0c;通过查看MOS&#xff0c;发现是个BUG ADG备库的ALERT错误日志如下&#xff1a; Errors in file /u01/app/oracle/diag/rdbms/hxxxsz/hxxxsz1/trace/hxxxsz1_lgwr_69…...

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…...

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...

【2024 Dec 超实时】编辑安装llama.cpp并运行llama

首先讲一下环境 这是2024 年12月&#xff0c;llama.cpp 的编译需要cmake 呜呜呜 网上教程都是make 跑的。反正我现在装的时候make已经不再适用了&#xff0c;因为工具的版本&#xff0c;捣鼓了很久。 ubuntu 18 conda env内置安装。 以下是可以完美编译llama.cpp的测试工具版…...

Docker介绍、安装、namespace、cgroup、镜像-Dya 01

0. 容器简介 从生活上来说&#xff0c;容器是一种工具&#xff0c;可以装东西的工具&#xff0c;如衣柜、背包、行李箱等等。 从IT技术方面来说&#xff0c;容器是一种全新的虚拟化技术&#xff0c;它提高了硬件资源利用率&#xff0c;结合k8s还可以让企业业务快速横向扩容、业…...

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件&#xff0c;进行配置&#xff1a; version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...