[Linux] IPC共享内存

ANSYS材料库实战:手把手教你用APDL命令流定义混凝土和形状记忆合金 本文详细介绍了在ANSYS中使用APDL命令流定义混凝土和形状记忆合金(SMA)的高级建模技巧。通过SOLID65单元和SMA本构模型,工程师可以精确模拟非线性材料行为,包括混凝土的开裂和SMA的超弹性效应。文章提供了完整的命令流示例和求解策略优化建议,帮助用户提升工程仿真效率。 阅读详情

一、共享内存原理

在这里插入图片描述

二、共享内存生命周期

共享内存的生命周期是随内核的。
匿名管道、命名管道、消息队列、信号量、共享内存这五种进程间通信方式。两种管道的生命周期是随进程,剩下的都是随内核的。

三、共享内存为什么是最快的通信方式?

  因为共享内存的原理是:在物理内存中直接开辟一片空间,并将空间映射到各个进程的虚拟地址空间的共享区;这时候进程就可以通过虚拟地址来直接对共享内存进行操作。
  其他通信的方式是将数据拷贝到内核态,用的时候再从内核态拷贝到用户态进行操作
  共享内存少了两步从用户态<–>内核态之间的数据拷贝过程,所以共享内存最快。


注意共享内存并没有进行同步与互斥,所以最好搭配信号量或互斥锁来使用。


四、共享内存的操作流程

第一步:创建共享内存

这一步需要指定标识符、大小、权限。成功会返回一个句柄。
使用函数:int shmget(key_t key, size_t size, int shmflg);
参数:
key:共享内存标识符 这个key可以自己去指定成任意的数字也可以通过系统提供的接口 ftok 去生成一个System V 标准的 IPC key 值
size:共享内存大小,最小也是一个内存页的大小,4096个字节
shmflg:选项信息(权限信息以及如何操作共享内存)

ftok解释:
ftok - convert a pathname and a project identifier to a System V IPC key(通过一个文件名和proj id生成一个System V 标准的IPC key 值)
   key_t ftok(const char *pathname, int proj_id);
    具体过程:proj_id是一个数字,在ftok这个函数内部通过文件名获取到文件的inode结点号,然后将inode结点号这个数字取出一部分,再取出proj_id的一部分,合并起来组成 key 值。
    ftok的缺陷:由于ftok是通过文件名和proj_id生成一个key值,会有多个进程连接到共享内存,万一文件被删除了,那么其他进程也就无法访问到这段共享内存了。就算重新创建一个文件,文件的inode结点号也是不一样所以还是无法访问到这段共享内存。

第二步:将共享内存映射到虚拟地址空间

需要句柄、虚拟地址空间的首地址(以便知道映射到哪里去)
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid: 共享内存创建返回的句柄
shmaddr:映射首地址-通常置NULL
shmflg:
0 可读可写
SHM_RDONLY 只读
返回值:成功:返回映射首地址 失败:返回 (void*)-1

第三步:进行内存操作
第四步:解除映射关系

int shmdt(const void *shmaddr);
参数:
shmaddr: 映射首地址
返回值:成功返回:0 失败返回:-1

第五步:删除共享内存

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
shmid: 句柄
cmd: 操作
IPC_RMID 删除共享内存
buf: 设置/获取属性信息
想获取传入首地址,不想获取置NULL
共享内存并不会被立即删除,而是判断当前连接数,若不为0,则拒绝后续连接,直到连接数为0的时候才删除这块共享内存。


写一个共享内存读写的例子:
shm_read.c

/*共享内存的基本使用*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/shm.h>

#define IPC_KEY 0x12345678
#define PROJ_ID 0x12345678
#define SHM_SIZE    4096
int main()
{
	//1、创建/打开共享内存
    int shmid = shmget(IPC_KEY, SHM_SIZE, IPC_CREAT|0664);
    if(shmid < 0){
		perror("shmget error");
		return -1;
    }

	//2、将共享内存映射到虚拟地址空间
    char *shm_start = (char*)shmat(shmid, NULL, 0);
    if(shm_start == (void*)-1){
		perror("shmat error");
		return -1;
    }

    //3、进行内存操作
    int i = 0;
    while(1){
		printf("%s\n", shm_start);
		sleep(1);
    }

    //4、解除映射关系
    shmdt(shm_start);

    //5、删除共享内存
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}

shm_write.c

/*共享内存的基本使用*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/shm.h>

#define IPC_KEY 0x12345678
#define PROJ_ID 0x12345678
#define SHM_SIZE    4096
int main()
{
    //1、创建/打开共享内存
    int shmid = shmget(IPC_KEY, SHM_SIZE, IPC_CREAT|0664);
    if(shmid < 0){
		perror("shmget error");
		return -1;
    }
    //2、将共享内存映射到虚拟地址空间
    char *shm_start = (char*)shmat(shmid, NULL, 0);
    if(shm_start == (void*)-1){
		perror("shmat error");
		return -1;
    }
    //3、进行内存操作
    int i = 0;
    while(1){
		sprintf(shm_start, "开始输出!!! +%d\n", i++);
		sleep(1);
    }
    //4、解除映射关系
    shmdt(shm_start);
    //5、删除共享内存
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}
从零开始构建高精度称重系统:ADS1232硬件设计与软件调优实战 本文详细介绍了如何基于TI的ADS1232 24位ADC芯片构建高精度称重系统,涵盖硬件设计、软件调优及校准算法。通过优化电源设计、PCB布局和卡尔曼滤波算法,实现毫克级测量精度,适用于工业自动化和实验室等高要求场景。 阅读详情

相关推荐

手把手教你在全新服务器内网安装OpenEuler 22.03 LTS SP4+ 安装 openGuass 5.0.0(LTS) 数据库

openEuler是面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的开源服务器Linux操作系统。

cgqyw的专栏 3736

linux进阶37——共享内存

1. 概念 共享内存就是允许两个或多个进程共享一定的存储区。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。 注:共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步。 2. 特点 两个进程地址通过页表映射到同一片物理地址以便于通信,你可以给一个区域里面写入数据,理所当然你就可以从中拿取数据,这也就构成了进程间的双向通信,而且共享内存是IPC通.

www_dong的博客 742

汇川EASY521 PLC实战指南:从硬件选型到程序架构与故障排查

可编程逻辑控制器(PLC)是工业自动化系统的核心大脑,其工作原理基于循环扫描机制,持续读取输入、执行用户程序并更新输出。这种确定性控制方式,使其在逻辑控制、顺序控制和运动控制中具有不可替代的技术价值,广泛应用于机械设备、生产线和过程控制等场景。对于汇川EASY521这类紧凑型高性能PLC,其核心优势在于集成了运动控制与丰富通讯接口,为中小型设备提供了高性价比的一站式解决方案。在实际应用中,工程师常需处理如“汇川sv660n”伺服驱动器的集成调试,或利用“hslcommunication”等开源库实现C#上位

weixin_42525264的博客 735

共享内存

共享内存的创建 步骤: 创建共享内存 映射进各自的地址空间。 函数 shmget //创建共享内存 int shmget(key_t key, size_t size, int shmflg); key:唯一标识符,在操作系统内部,保证找到同一份资源,必定唯一 size:大小,单位是页 shmflg:权限 返回值:成功共享内存标识符,失败-1,在应用层标识资源 ftok ...

weixin_43697119的博客 316

REST-meta-MDD Data总结

sMRI数据使用:nwc1、nwc2、nwc3(同样数据集相关论坛中有相关信息指向需要使用wc1、wc2、wc3)多方咨询与讨论后决定使用nwc数据,这里说明wc数据相对wc数据要大的多如wc1的大小为1.33GB,而nwc1的数据却有6.90GB。VBM文件:/REST-meta-MDD/Sharing/REST-meta-MDD-VBM- phase1 -Sharing.tar.gz。1、Excel中的表型信息:1-男,2-女;-9999或空白表示缺少数据。

2404_88295660的博客 1532

【没有网络,安装python包】如何从 PyPI 下载并安装 Plotly 的离线包

在某些情况下,您可能需要在没有互联网连接的环境中安装 Python 包,例如在飞机上、在某些受限制的网络环境中或在需要离线安装的场景下。以下是如何在 PyPI(Python Package Index)下载 Plotly 包并进行离线安装的详细步骤。

赖德发的博客 1103

Linux:简单理解System V -- 共享内存、消息队列、信号量

System V共享内存共享内存的操作流程:共享内存函数消息队列信号量 共享内存 本质原理: 多个进程要是映射同一块物理内存,就可以通过这块内存实现数据共享 在物理内存上开辟一块内存空间 多个进程可以将这块物理内存映射到自己的虚拟地址空间 通过虚拟地址进行页表映射直接访问这块物理内存,实现数据共享 特性: 最快的进程间通信方式 生命周期随内核 注意事项: 共享内存的操作是不安全的(并不会自动具备同步与互斥关系,需要操作用户进行控制) 操作: 代码操作流程/具体的接口+命令操作ipcs/ipcrm

AngelDg的博客 936

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 382

共享内存(一)—— 共享内存的创建与释放

由于进程通信的本质是要让两个不同的进程看到同一份资源,我们可以在物理内存上开辟一块空间,这块空间被称为共享内存,然后让这两个进程通过某种方式都能访问到这块内存,这样的话,两个进程之间就可以通信了。

ttcet的博客 2459

姿态传感器/陀螺仪之IIS2DLPC 应用驱动程序设计

* 转换为°C单位 (参考温度为25°C,灵敏度为16 LSB/°C) */

corlin6688的博客 219

车载以太网:PHY(物理层)介绍

本文以TJA1101芯片为实例介绍了车载以太网PHY(物理层)组成。

kevin1499的博客 6231

Linux:共享内存

共享内存的原理 在物理内存中开辟一块空间; 不同进程通过页表将该空间映射到字节的进程虚拟地址空间中; 不同进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存; 使用共享内存步骤: 创建共享内存; 附加,将进程附加该共享内存上(将进程虚拟地址和物理地址通过页表建设映射关系); 分离,将虚拟地址和物理地址的映射关系从页表中删除 共享内存映射到物理地址空间时 ,是映射在共享区中(在栈区和堆区中间) 共享内存接口: 1.创建或者获取共享内存 key_t ftok(const char

qq_45481606的博客 3033

【Docker】一招解决超时镜像超时报错:`ERROR: Get https://registry-1.docker.io/v2/`

Docker 镜像拉取超时或失败并不是 Docker 本身的缺陷,而是网络环境和默认配置在特定场景下的限制所导致的结果。通过本文的分析可以看到,问题的核心往往集中在三个方面:网络访问延迟、DNS 解析速度以及客户端默认超时时间。针对这些问题,最直接、有效的做法是使用国内镜像加速器,这不仅能够显著提升拉取速度,还能保证在企业内网或家庭网络中更加稳定

博客 1027

Linux IPC(共享内存)

让两个不同的进程看到同一个内存块(存在于物理内存当中)实现共享内存,看到同一份资源。

weixin_48133237的博客 906

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OV9734 DATASHEET,完整规格书

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

Linux——System V 共享内存 IPC

共享内存通信原理与实现 共享内存是最高效的IPC通信方式,通过将物理内存映射到多个进程地址空间实现数据共享。其核心步骤包括: 创建共享内存:使用shmget函数,通过key标识内存段,设置权限和大小 内存映射:通过shmat将共享内存附加到进程地址空间 通信操作:进程可直接读写共享内存区域 资源释放:使用shmdt解除映射,shmctl或命令行删除共享内存 特点: 通信速度快(不经过内核) 双向通信能力 需要手动管理同步问题 生命周期与内核相同,需显式释放 关键参数: key:系统级标识(通常由ftok生成

二哈的博客 940

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

linux SysV IPC shm共享内存实现

共享内存可以使多个进程共享某段内存,由于不需要进程间数据复制,所以是速度最快的IPC。 多个进程访问共享内存时需要同步机制,如进程A往共享内存中写数据时,进程B不能使用共享内存;通常采用信号量同步多进程访问共享内存。 共享内存实现主要有以下几点: 1.分配物理内存 2.将物理内存映射到进程的地址空间;通过修改进程的页表,可以虚拟地址直接访问物理内存 3.进程不再使用共享内存时,取消物理内

永无止境 4574

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux内核IPC源码——共享内存

0]. sem->count的数值>=0, 如果count>0, 说明当前信号量没有被占用, 可以获取;如果countlist来添加等待任务或者唤醒任务;[0]. 定义信号量结构体变量;[1]. 初始化信号量变量。

生活需要深度 921

Linux IPC对象——共享内存

IPC对象学习——共享内存(1)描述(2)特点(3)共享内存使用步奏1.shmget函数创建共享内存2.shmat 映射3.shmdt 撤销映射4.shmctl 删除共享内存对象 (1)描述 (1)IPC对象包括: 共享内存、消息队列、信号灯集 (2)每个IPC对象都有唯一的ID值——key (3)IPC对象创建后,直到进程结束,系统会默认释放(在服务器上可能不行),当然人为撤销最好 (4)每个 IPC 对象都有对应的 key值 ,当key为 0 时,表示为 私有的共享内存,否则key 和 ID 对应相同

正弦定理的博客 663

Linux-IPC之共享内存

System V(标准)共享内存机制: shmget  shmat  shmdt  shmctl 原理及实现:system V IPC机制下的共享内存本质是一段特殊的内存区域,进程间需要共享的数据被放在该共享内存区域中,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间(虚拟地址空间)中去。这样一个使用共享内存的进程可以将信息写入该空间,而另一个使用共享内存的进程又可以通过简单的

一个写程序的 1122

linux 共享内存_Linux下IPC机制的通信方式:共享内存

图控大叔构图传递思想阅读从未如此简单!!!01前言 继续刚!今天分享的内容是Linux下IPC机制的通信方式:共享内存,之前我们已经分享了消息队列,下一篇我们将分享IPC机制的通信方式:信号量。继续刚,干就完事了!02IPC回顾IPC内核当中为了增强进程与进程之间数据交互及效率的一种机制的对象英文名Inter ProcessCommunication中文名进程间通信IPC里...

weixin_39737636的博客 116

linux ipc 共享内存,Linux IPC 共享内存用法

Linux IPC 常见的方式写 Linux Server 端程序,必然会涉及到进程间通信 IPC. 通信必然伴随着同步机制,下面是一些常见的通信与同步机制:进程间通信:匿名管道,命名管道,消息队列,共享内存,Domain Socket, 本机 TCP Socket,文件进程间同步:信号,信号量线程间同步:条件变量,互斥量,读写锁,自旋锁,Barrier.对于大部分的业务场景,本机 TCP Soc...

weixin_32514497的博客 194

【Linux】IPC通信之共享内存

共享内存概念 共享内存指的是,在多处理器的计算机系统中,可以被不同的CPU访问大量内存。由于多个CPU需要快速访问存储器,所以必须对存储器进行缓存。在缓存中的数据被更新后,其他处理器也可能要进行读取,共享内存就需要立即更新,否则不同的处理器将读取到不同的数据。共享内存是Unix、Linux下多进程通信的一种方式之一,这种方法通常用于一个程序的多进程间通信。实际上多个进程可以通过共享内存来进行通信

皓皓松的博客 489

Linux 18 IPC之共享内存shm

一、原理 共享内存是三个IPC(Inter-Process Communication)机制中的一个。 它允许两个不相关的进程访问同一个逻辑内存。 共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式。 大多数的共享内存的实现, 都把由不同进程之间共享的内存安排为同一段物理内存。 共享内存是由IPC为进程创建一个特殊的地址范围, 它将出现在该进程的地址空间中。 其他进程可以将同一段共享内...

分享各种网络协议知识 5628

Linux C笔记之IPC对象——共享内存

IPC对象——共享内存相关函数shmgetshmat 、shmdtshmctl 相关函数 shmget 创建共享内存, 通过key返回id 函数原型: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); 参数: key: IPC_PRIVA...

qq_1398871032的博客 428

linux基于信号量同步的共享内存IPC实现

linux常见IPC方式有:管道,有名管道,信号量,消息队列,共享内存,socket套接字。共享内存是最快的IPC方式。 本文是具体别称实现共享内存的IPC,一个程序向内存写数据,另一个程序读数据,共享内存牵扯到同步的问题,一般有三种方案可以实现共享资源的同步 信号量,记录锁和互斥量。        使用信号量,首先服务端创建一个只含一个信号的信号量集合,并初始化为1。占据资源,则以sem_

水滴石穿 3881

Linux IPC共享内存管理指南:从命令到实战应用

Linux IPC 共享内存 通过本文的深度优化和扩展,您应该掌握Linux IPC共享内存的核心管理技术和高级应用方案。这些知识将帮助您构建高性能、高可靠的进程间通信系统,满足从基础应用到复杂生产环境的各种需求。

9426224 706
上一篇: linux之信号量,PV操作
下一篇: STL之vector模拟实现
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值