Linux共享内存

Linux——详解共享内存shared memory_linux 共享内存 共享内存本质上就是内存中的一块区域,用于进程间通信使用。该内存空间由操作系统分配与管理。与文件系统类似的是,操作系统在管理共享内存时,不仅仅有内存数据块,同时还会创建相应结构体来记录该共享内存属性,以便于管理。因此,共享内存不只有一份,可以根据需求申请多个。进程之间进行通信的时候,会获取 到共享内存的地址,写端进程写入数据,读端进程通过直接访问内存完成数据读取。 阅读详情

共享内存是一种进程间的通信方式。

shmget(); 创建共享内存,返回标识符

shmat(); 把共享内存映射到进程的地址空间中

shdt(); 断开与共享内存的连接,非删除

shmctl(); 共享内存管理(删除,或改变状态)

Linux操作共享内存相关命令

 ipcs 查看消息队列,共享内存和信号量

ipcrm -m 32769 删除标识为32769的共享内存

 程序例子,父子间进程通信:

#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>

#define SIZE 1024

int main()
{
    int shmid;
    pid_t pid;
    char *shmaddr;
    int flag;
    struct shmid_ds buf;

    shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0600);
    if(shmid < 0)
    {
        perror("get shm ipc_id error");
        return -1;
    }

    if((pid = fork()) < 0) {
        perror("get fork error");
        return -1;
    } else if(pid == 0) {       /* child */
        shmaddr = (char *)shmat(shmid, NULL, 0);
        if((int)shmaddr == -1)
        {
            perror("shmat error");
            return -1;
        }
        strcpy(shmaddr, "Hi,I am child process!\n");
        shmdt(shmaddr);
        return 0;
    } else {                    /* parent */
        sleep(3);
        flag = shmctl(shmid, IPC_STAT, &buf);
        if(flag == -1)
        {
            perror("shmctl error");
            return -1;
        }

        printf("shm_segsz=%d bytes\n", buf.shm_segsz);
        printf("parent pid=%d,shm_cpid=%d \n", getpid(), buf.shm_cpid);
        printf("child pid=%d,shm_lpid=%d\n", pid, buf.shm_lpid);
        shmaddr = (char *)shmat(shmid, NULL, 0);
        if((int)shmaddr == -1)
        {
            perror("parent:shmat error");
            return -1;
        }
        printf("shmaddr in %s\n", shmaddr);
        shmdt(shmaddr);
        shmctl(shmid, IPC_RMID, NULL);
    }

    return 0;
}

编译

gcc shm.c -o shm

输出结果

shm_segsz=1024 bytes
parent pid=6163,shm_cpid=6163 
child pid=6164,shm_lpid=6164
shmaddr in Hi,I am child process!

 

程序例子,进程之间使用共享内存通信

shmwrite.c

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>

typedef struct {
        char name[8];
        int age;
}people;

int main()
{
        int shmid;
        key_t key;
        char temp[8];
        char pathname[30];
        people *p_map;
        int i;

        strcpy(pathname, "/tmp");
        key = ftok(pathname, 0x03);
        if(key == -1)
        {
                perror("ftok error\n");
                return -1;
        }

        printf("key=%d\n", key);
        shmid = shmget(key, 4096,IPC_CREAT|IPC_EXCL|0600);
        if(shmid == -1)
        {
                perror("shmget error\n");
                return -1;
        }
        printf("shmid=%d\n",shmid);

        p_map = (people *)shmat(shmid, NULL, 0);
        if((int)p_map == -1)
        {
                perror("shmat error\n");
                return -1;
        }
        memset(temp, 0x00, sizeof(temp));
        strcpy(temp, "test");
        temp[4] = '0';

        for(i=0;i<3;i++)
        {
                temp[4]+=1;
                strncpy((p_map+i)->name, temp, 5);
                (p_map+i)->age=i;
        }

        if(shmdt(p_map) == -1)
        {
                perror("shmdt error\n");
                return -1;
        }
        return 0;
}

 shmread.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
        char name[8];
        int age;
}people;

int main(int argc, char *argv[])
{
        int shmid;
        people *p_map;
        key_t key;
        char pathname[30];
        int i = 0;

        strcpy(pathname, "/tmp");
        key = ftok(pathname, 0x03);
        if(key == -1)
        {
                perror("ftok error\n");
                return -1;
        }
        printf("key=%d\n", key);
        shmid = shmget(key, 0, 0);
        if(shmid == -1)
        {
                perror("shmread:shmget error\n");
                return -1;
        }
        printf("shmid=%d\n",shmid);
        p_map = (people*)shmat(shmid, NULL, 0);
        for(i=0;i<3;i++)
        {
                printf("name:%s\n", (*(p_map+i)).name);
                printf("age:%d\n", (*(p_map+i)).age);
        }
        if(shmdt(p_map) == -1)
        {
                perror("shmdt error\n");
                return -1;
        }
        return 0;
}

编译

gcc shmread.c -o shmread
gcc shmwrite.c -o shmwrite

shmwrite执行结果

key=50397185
shmid=262144

shmread执行结果

key=50397185
shmid=262144
Segmentation fault (core dumped)

结果很奇怪, 不知道为什么

参考资料:

https://www.cnblogs.com/ch122633/p/8068152.html

https://blog.youkuaiyun.com/wteruiycbqqvwt/article/details/90484317 

【linux】共享内存 分配共享内存 使用shmget函数来分配,首先来看shmget里的参数 该函数的第一个参数是一个用来标识共享内存块的键值。彼此无关的进程可以通过指定同一个键以获取对同一个共享内存块的访问。不幸的是,其它程序也可能挑选了同样的特定值作为自己分配共享内存的键值,从而产生冲突。用特殊常量IPC_PRIVATE作为键值可以保证系统建立一个全新的共享内存块。 该函数的第二个参数指定 阅读详情

相关推荐

Dify 1.0+内网部署全攻略:模型插件离线安装与信创环境适配

本文详细介绍了Dify 1.0+版本在内网环境中的部署全攻略,重点解析了模型工具插件的离线安装方法与信创环境适配技巧。通过实战经验分享,帮助企业在严格的内网隔离条件下高效部署AI平台,解决插件依赖和安装难题,提升大语言模型的应用效率。

weixin_29224529的博客 275

linux共享内存介绍

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

qq_34888036的博客 5805

基于 国产USRP B210 的通信+侦测+干扰三合一实验平台,解锁无线攻防全场景!

在当代复杂电磁环境与多样化通信需求并存的背景下,软件定义无线电(SDR)技术正展现出前所未有的系统灵活性与功能可重构性。由两台USRP-LW B210软件无线电设备模拟无线链路通信过程,能够模拟多种无线通信信号传输及图像传输场景,适用于通信协议验证、抗干扰测试及教学实验。,支持"通信-侦测-干扰-优化"的闭环实验流程,为无线通信领域的教学科研与工程应用提供了一套经济高效、功能完备的解决方案。系统可对通信链路信号进行快速、自动化侦测、识别、告警,并支持多种干扰信号生成、模式切换及效果评估功能。

luowave2012的博客 833

Linux——详解共享内存shared memory

共享内存本质上就是内存中的一块区域,用于进程间通信使用。该内存空间由操作系统分配与管理。与文件系统类似的是,操作系统在管理共享内存时,不仅仅有内存数据块,同时还会创建相应结构体来记录该共享内存属性,以便于管理。因此,共享内存不只有一份,可以根据需求申请多个。进程之间进行通信的时候,会获取 到共享内存的地址,写端进程写入数据,读端进程通过直接访问内存完成数据读取。

weixin_61857742的博客 1万+

MMCV安装后报错‘from mmcv import Config’?别慌,这是MMCV 2.0的锅!快速降级回退MMCV 1.x全指南

本文详细解析了MMCV 2.0版本升级导致的‘from mmcv import Config’报错问题,提供了从诊断到降级回退MMCV 1.x的完整解决方案。通过pip和OpenMIM工具链的实操指南,帮助开发者快速解决版本冲突,确保项目稳定运行。

weixin_29102619的博客 263

Python实战:基于PyG和Stable-Baselines3复现柔性车间调度算法(附数据集)

本文提供了一份基于图神经网络与深度强化学习的柔性车间调度实战指南。通过PyTorch Geometric构建异构图表示车间状态,并利用Stable-Baselines3中的PPO算法训练调度智能体,详细介绍了从环境建模、网络设计到训练评估的完整代码实现,帮助开发者构建可复用的工业级智能调度系统。

ansible6ops的博客 608

Linux 共享内存

创建共享内存:在Linux系统中,可以使用shmget函数来创建一个共享内存标识符。该函数需要指定共享内存的大小、权限等参数,并返回一个唯一的标识符。连接共享内存:使用shmat函数将进程与共享内存进行连接,该函数需要传入共享内存标识符和一个用户指定的地址,如果地址为0,则由系统选择一个可用的地址。使用共享内存:连接成功后,进程可以像使用普通内存一样使用共享内存,通过读写共享内存实现进程间的数据交换。分离共享内存:使用shmdt函数将进程与共享内存分离,分离后进程不能再访问共享内存。

小灰灰的博客 3036

【寄存器模型】一、一个简单的寄存器模型

在描述寄存器模型之前,首先来了解一下实际寄存器的组成结构:如下图所示的DUT内部真实的寄存器寄存器中最小的一个单位是域(field),域是由一个或多个bit拼接而成的。一个或多个域就构成了一个寄存器(reg)。一个或多个寄存器就构成了一个块(block)。将DUT中的寄存器抽象出来,建立寄存器模型,如下图所示:uvm library已经定义好了field、reg、block等相关的概念,构建寄存器模型时,只需要继承这些类即可。:构建寄存器模型中的域段。uvm_reg。...

carrotbanana的博客 5368

【Linux】共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

zxj20041003的博客 1945

Matlab实战:水声信号DEMON谱分析从入门到精通(附完整源码)

本文详细介绍了使用Matlab进行水声信号DEMON谱分析的完整流程,从基础理论到实战应用,涵盖信号预处理、包络提取、频谱分析等关键步骤,并附完整源码。特别针对水声通信中的低信噪比环境,提供了多种优化方案和性能提升技巧,帮助读者快速掌握这一水下目标检测的核心技术。

gamma的博客 296

【KDD2024】ShapeFormer:用于多元时间序列分类的Shapelet Transformer

多元时间序列分类(MTSC)因其在现实世界中的广泛应用而吸引了大量研究关注。最近,Transformer在MTSC中取得了先进的性能。然而,

m0_52597077的博客 4747

【Linux】——共享内存

1、共享内存的定义和原理 2、特点 3、共享内存的使用 4、应用 5、进程间通信的几种方式总结

qq_43412060的博客 2950

BitLocker磁盘锁定解决方法

摘要:本文介绍了BitLocker加密磁盘被锁的两种情况及解决方法。对于系统盘锁定,建议在微软账户中查找48位恢复密钥;数据盘锁定可尝试密码或恢复密钥解锁。若密钥丢失,可通过IT支持或数据恢复服务尝试解决。预防措施包括妥善备份密钥到微软账户和离线位置,避免随意更改系统硬件配置。BitLocker安全性高,恢复密钥是解锁关键,提醒用户务必做好备份以防数据丢失。(148字)

yueke06442300的专栏 2677

Linux——共享内存

Linux——共享内存

qq_67693066的博客 2183

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

初识Linux · 共享内存

size代表的是开辟的共享内存的大小,对于shmflg,也就是共享内存的标志,我们这里就介绍两个常用的,一个是IPC_CREAT 一个是IPC_EXCL,使用时候我们可以分为IPC_CREAT使用,IPC_EXCL单独使用没有意义,IPC_CREAT | IPC_EXCL使用。其中key是16进程的,所以我们前面会转成16进程的方便观察,shmid是0,owner是lazy,perms权限为0,共享内存的大小是4096,nattch对应的是0,代表的意思是挂接的进程为0,status状态。

更新各种计算机技能~ 1607

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux共享内存

共享内存概念: ;获取或申请共享内存 ;映射共享内存到进程的虚拟空间 ;解除映射 ;删除共享内存:

qq_54075859的博客 2308

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入了解linux系统—— 共享内存

System V IPC(Inter-Process Communication)是Unix System V操作系统引入的一组进程间通信机制,后来被大多数Unix-like系统所采纳。消息队列(Message Queues)- 进程可以通过消息队列发送和接收格式化数据块信号量(Semaphores)- 用于进程间的同步控制共享内存(Shared Memory)- 允许多个进程访问同一块内存区域,是最快的IPC方式。

LH__1314的博客 1542

linux共享内存好处,linux共享内存

linux共享内存的设计posix的共享内存是通过用户空间挂在的tmpfs文件系统实现的,而system V的共享内存是由内核本身的tmpfs实现的,这里可以看出,二者其实是用同一种机制实现的,不同的是用户接口不同,posix旨在提供一套统一的可用接口而不是实现,因此posix的上层根本就不会在意其机制是内核实现的还是用户空间实现的,因此用文件系统实现再好不过了,在linux上它实际上是通过用户空...

weixin_33895652的博客 449
上一篇: 总结-慕课网基础课程
下一篇: CS106L,QT踩坑
DedicateToAI
博客等级 码龄9年 6粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值