「Linux」进程间通信---共享内存

【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制) 进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制) 阅读详情

文章目录

  • 1.命名管道
    • 2.共享内存
    • 3.共享内存的接口
    • 4.共享内存的标识符和共享内存的操作句柄的区别是什么?
    • 5.删除共享内存

1.命名管道

  •  命名管道也是内核中开辟的一段缓存区,这段缓存区是有标识符的:意味着:不同的进程,不需要有亲缘关系,只需要通过标识符就能找到该缓存区
  •  命名管道的创建
  • mkfifo [命名管道文件]
    p:代表的文件类型为管道文件
  • 函数创建
    mkfifo函数
  •  特性
  • 命名管道的生命周期也是跟随者进程的
  • 命名管道是具有标识符的
  • 其他的特性和匿名管道是一致的

2.共享内存

  •  原理
  • 在物理内存当中开辟了一段空间
  • 这段物理内存的空间,可以被不同的进程附加到自己的共享区当中
  • 附加的进程,通过操作共享区,来交换数据

3.共享内存的接口

  •  创建共享内存
  • int shmget(key_t key, size_t size, int shmflg)
    key:共享内存标识符,这个标识符相当于共享内存的身份证,程序员第一次创建的时候,可以随意给值,只要和当前操作系统当中的其他的共享内存标识符不重复
    size:共享内存的大小,单位:字节
    shmflg:① IPC_CREAT:如果共享内存不存在,则创建共享内存
    ② IPC_EXCL:需要搭配IPC_CREAT使用,这样的宏在搭配使用的时候,还是采用按位或的方式(核心就是位图)
    eg:IPC_CREAT | IPC_EXCL:
    如果想要获取的共享内存,已经存在,则报错。如果想要获取的共享内存,是刚刚新创建出来的共享内存,则返回操作句柄
  • 总结:使用shmget这个函数的时候一定要自己刚刚创建出来的共享内存
  • 返回值:返回的是共享内存的操作句柄
  •  共享内存命令
  • ipcs:查看共享内存
  • ipcrm -m [shmid]:删除共享内存
  • 共享内存的声明周期是跟随着操作系统内核的
  •  将共享内存附加到进程
  • void shmat(int shmid, const void shmaddr, int shmflg)
    shmid:共享内存的操作句柄
    shmaddr:附加到共享内存的什么虚拟地址,允许传递NULL值,让操作系统帮我们选择附加到共享内存区当中的那个地址,这个地址通过该函数的返回值返回给我们
    shmflg:① SHM_RDONLY:规定当前进程只能对共享内存进行读操作
    ② 0:可读可写
  • 返回值:返回共享内存附加到共享区的地址
  • 结论:进程在读取共享内存的时候,是访问,并不是拿走!
  •  将共享内存和进程分离
  • int shmdt(const void *shmaddr)
    shmaddr:shmat的返回值
  •  操作共享内存
  • int shmctl(int shmid, int cmd, struct shmid_ds *buf)
    shmid:共享内存操作句柄
    cmd:告诉shmctl函数需要做什么操作
    ① IPC_STAT:获取当前共享内存的属性信息,放在buf中,buf是出参
    ② IPC_SET:设置共享内存的属性信息,是用buf来进行设置的,buf是入参
    ③ IPC_RMID:删除共享内存,buf可以直接传递NULL
    buf:共享内存的结构体

4.共享内存的标识符和共享内存的操作句柄的区别是什么?

  • 标识符:是用来标识共享内存的,相当于共享内存的身份证,意味着不同的进程可以通过标识符找到这个共享内存
  • 操作句柄:进程可以通过操作句柄来对共享内存进行操作(,附加,分离,删除)

5.删除共享内存

  • 当使用shmctl或者使用ipcrm,删除共享内存之后,共享内存就实际被释放掉了
  • 当共享内存被释放掉之后,共享内存的标识符会被设置为0x00000000,表示其他进程不能通过之前的标识符找到该共享内存,并且共享内存的状态会被设置为dest(destroy)
  • 当共享内存被释放掉之后,但是还是有进程在附加着共享内存,当前描述共享内存的结构体并没有被释放,直到当前共享内存的附加进程数量为0的时候才会释放掉。

 

【Linux】Linux 共享内存:高效的进程间通信 共享内存是一块可以被多个进程同时访问的内存区域,允许不同进程读取和写入同一份数据。每个进程都可以直接访问这块内存,不需要通过管道、套接字或消息队列进行数据传输。这种直接访问的特点使得共享内存成为最为高效的进程间通信机制之一,适用于需要频繁交换大量数据的场景。 阅读详情

相关推荐

从零到一:3D Slicer与MONAI在医学影像中的AI革命

本文探讨了3D Slicer与MONAI在医学影像分析中的革命性应用,展示了如何通过开源工具实现高效的三维影像处理和AI增强分析。结合临床案例,详细介绍了从数据准备到AI分析的全流程,显著提升诊断效率和精度,推动医学影像技术迈向新纪元。

tcp8optimizer的博客 342

Linux进程通信之共享内存

Linux 共享内存

m0_60010936的博客 1478

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

【IPC通信】key_t键和ftok函数

System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用key_t值做为它们的名字。key_t这个数据类型在<sys/types.h>有定义,通常是一个至少32位的整数。 我们通常使用ftok()函数(可以如此记忆:file to key)把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键。(当然,我们也可以不用ftok函数来生成该键,指定一个整数也是可以的,当然你需要考虑键...

weixin_49356927的博客 3765

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ...

开开心心 25万+

Android 10.0 SystemUI下拉状态栏点击设置跳转设置时白屏修改

在10.0的系统rom定制化开发中,在SystemUI下拉状态栏下方点击设置图标跳转设置的过程中,发现 有白屏显示挡住设置界面,显示白屏,接下来分析下相关原因来解决这个问题

安卓兼职framework和app工程师的博客 81

[Linux]进程间通信--共享内存

讲解使用system V共享内存进行进程间通信的原理以代码实现。

csdn_myhome的博客 704

基于容积卡尔曼滤波的弹目相对姿态估计算法及其在导弹末端制导中的应用

本文针对导弹末端制导中的强非线性姿态估计问题,提出了一种基于容积卡尔曼滤波(CKF)的弹目相对姿态估计算法。通过建立包含视线角、角速率和相对距离的6维状态模型,利用三阶球面-相径容积准则精确逼近非线性状态分布,避免了传统EKF的线性化误差。在MATLAB/Simulink仿真中,CKF表现出比EKF更高的视线角速率估计精度和更快的收敛速度,最终显著减小了脱靶量,验证了其在提升导弹末端制导精度方面的有效性。该算法计算复杂度适中,适合工程实现,为高精度非线性姿态估计提供了新思路。

AI的内部世界的博客 105

进程间通信之共享内存

进程通信与共享内存

为以后打基础吧 631

修改Windows hosts文件的解决方案

本文主要介绍了修改Windows hosts文件解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 安装软件 2.2 修改hosts文件

weixin_43178406的博客 1万+

HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析

在“Spectrum Analyzer”对话框的“Stimulus”(激励)栏中,设置激励源频率为100MHz,选择“IC modeling”为“Fast-Strong”,并按图所示设置其他选项。显然,在仿真的基频上,它的幅值最大,将鼠标光标置于柱状图上,可以读取其值为64.28mA,这个数值是由选定的驱动芯片决定的。按上图所示的原理图,在接收端增加一个并联的RC负载,再次运行仿真,结果如图所示。在对话框左侧的“Pins”列表中,显示出了已添加电流探针的引脚,可以在此列表中选择所要仿真的目标。...

小幽余生不加糖 4681

Windows or Linux环境下利用“共享内存”实现进程间通信的C/C++代码

原文链接:http://blog.youkuaiyun.com/stpeace/article/details/39534361 进程A对应的程序:#include #include using namespace std; #define BUF_SIZE 1025 char szName[] = "NameOfMappingObject"; // 共享内存的名字 int main() {

David Xiao 2174

顶刊论文引言用AI怎么写?借助Gemini 3 Pro结合四段式写出逻辑清晰的Introduction

写研究目标时,先明确研究问题,直接回应前文提到的研究缺口,如 “This study aims to investigate whether X modulates Y via the Z pathway in human cells.”然后再提出你的研究假设,当理论依据清晰时,可以用如 “We hypothesized that inhibiting X would rescue Y deficiency in this model.”的句子点出研究目标。要求:1)明确陈述本研究拟解决的核心科学问题;

智能AI让学术科研更容易 181

Linux进程通信——共享内存:System V 进程间通信的极速方案

共享内存(Shared Memory)是 System V 标准中的一种进程间通信机制,它允许多个进程共享物理内存的一部分。共享内存的出现解决了多个进程之间如何高效交换数据的问题,它是最适合高速、大量数据传输的 IPC 方式之一。与其他通信方式(如消息队列、信号量等)不同,共享内存的特点在于,它提供了进程直接操作同一块内存的能力。进程无需经过内核的中介,即可直接在内存中读写数据,从而避免了多次内核交互所产生的开销。

2401_83603768的博客 1213

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux学习-通信(信号,共享内存)

信号是 Linux 系统中SIGINTSIGSTOPSIGCONTSIGSEGVSIGPIPESIGCHLDSIGALRM(接收方无法预测信号何时到达)、(打断当前代码流优先处理信号)。

2501_91684151的博客 912

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux进程间通信

Linux进程间通信pipe的使用,用C++实现模拟线程池,命名管道的创建以及通信,信号量

分享C/C++/Linux/网络/数据库/数据结构 1118

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

无名管道Pipe、有名管道FIFO、消息队列、共享内存-进程间通信

目录无名管道Pipe数据读出,Pipe管道中同时清除数据有名管道FIFO在数据读出时,FIFO管道中同时清除数据,并且“先进先出共享内存读走后还存在数据 无名管道Pipe 数据读出,Pipe管道中同时清除数据 //1.创建无名管道 int pipefd[2]; if(pipe(pipefd)==-1)break; pipefd[0]指向管道的读端 pipefd[1]指的是管道的写入端 特点 无名管道只能用于亲缘间的进程的通信 无名管道的大小是64K 无名管道中不能使用lseek

qq_47355554的博客 711

第七章:Linux进程间通信(IPC)——构成进程间通信的信道方案

进程间通信

yanyongfu523的博客 455

进程间通信

本文摘要:本文详细介绍了Linux系统中的进程间通信(IPC)机制,包括匿名管道、命名管道、共享内存、消息队列和信号量等。重点分析了匿名管道的实现原理,通过父子进程共享文件缓冲区实现单向通信,并讨论了管道的四种特性和应用场景。同时介绍了进程池技术,通过预先创建多个子进程和管道实现高效任务分发。此外,文章还探讨了命名管道、共享内存等IPC方式的原理和使用方法,以及信号量在进程同步中的作用。各种IPC机制各有特点,适用于不同场景,共同构成了Linux系统多进程协作的基础设施。

C/C++技术栈 704

Linux环境进程间通信:共享内存(下)

转载:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html 系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shmid_kernel结构联系起来的),后面还将阐述。 1...

zjy900507的博客 234

Linux环境进程间通信(五): 共享内存(下)

 Linux环境进程间通信(五): 共享内存(下)文档选项<!--document.write(打印本页);//-->打印本页<!--document.write(将此页作为电子邮件发送);//-->

jiantiantian的专栏 425

【Linux】进程间通信——共享内存

共享内存(Shared Memory)是一种进程间通信(IPC)机制,允许多个进程共享同一块物理内存,从而提高数据交换效率。相比其他 IPC 方式(如管道、消息队列等),共享内存具有速度快、低开销的优势,因为数据直接存储在内存中,而无需通过内核进行数据拷贝。共享内存作为一种高效的进程间通信机制,因其直接在内存中操作数据,避免了数据拷贝,提供了快速的数据传输方式。通过shmgetshmatshmctl等函数,Linux 系统为我们提供了灵活的共享内存操作接口。

2301_79969994的博客 5034

【Linux】进程间通信——System V共享内存

System V是一种在Linux系统中用于进程间通信(IPC)的机制。它提供了几种不同的通信方式,包括共享内存、消息队列和信号量。System V共享内存是一种高效的进程间通信(IPC)机制,它允许多个进程共享一块物理内存区域,从而避免了数据的复制,显著提高了数据传输速率。

Renswc的博客 2486

【Linux】「共享内存揭秘」:高效进程通信的终极指南

本文深入剖析了共享内存的实现机制、关键API的使用以及实际应用中的注意事项,并对比了其与其他IPC方式的优劣。在理解其高性能的同时,也要认识到同步与安全的挑战

Yui_的博客 3399

【Linux进程间通信】深入探索:Linux下的命名管道与System V共享内存

在Linux操作系统中,进程间通信(IPC)是一个至关重要的概念,它允许不同的进程之间进行数据交换和同步。随着现代操作系统的日益复杂,进程间通信的重要性也日益凸显。在众多IPC机制中,命名管道和System V共享内存无疑是两种最为常见且强大的工具

EterNity_TiMe_的计算机学习之路 3117

Linux进程间通信【共享内存】

共享内存出自System V标准,是众多IPC解决方案中最快的一种,使用共享内存进行通信时,不需要借助函数进入内核传递数据,而是直接对同一块空间进行数据访问,至于共享内存是如何使用的、通信原理是怎么实现的、以及共享内存+命名管道的组合通信程序该如何实现,都将在本文中解答

北 海的博客 1万+
上一篇: Java 日志框架,性能无敌,横扫所有对手
下一篇: 看来,MySQL next-key lock 的 bug 并没有被修复
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值