Linux 共享内存

2023-09-19 11:55:28

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
    功能:创建一个新的内存段或者获得一个既有的共享内存段的标识。
        新创建的内存段中的数据都会被初始化为0
    参数:
        -key:key_t类型是一个整型,通过这个创建或者找到一个共享内存
                    一般使用16进制表示 非0
        -size:共享内存的大小
        -shmflg:属性
            -访问权限
            -附加属性:创建/判断共享内存段是否存在
                -创建:IPC_CREAT
                -判断共享内存是否存在:IPC_EXCL,需要和IPC_CREAT一起使用
    返回值:失败-1成功 共享内存的引用ID



void *shmat(int shmid, const void *shmaddr, int shmflg);
    功能:和当前的进程关联
    参数: 
        -shmid:共享内存的标识(ID),由shmget返回值获取
        -shmaddr:申请的共享内存的起始地址,指定NULL,内核指定
        -shmflg:对共享内存的操作
            -SHM_RDONLY  必须要有读权限
            -读写:0
    返回值:失败 (void *) -1 成功返回共享内存的首地址


int shmdt(const void *shmaddr)
    功能:解除当前进程和共享内存的关联
    参数:共享内存的首地址
    返回值:失败-1 成功0

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    功能:对共享内存进行操作,共享内存要删除才会消失,创建共享内存的进程被销毁了对共享内存毫无影响
    参数:
        -shmid:共享内存的ID
        -cmd:要做的操作
            -IPC_STAT:获取共享内存的当前状态
            -IPC_SET:设置共享内存的状态
            -IPC_RMID:标记共享内存被销毁
        -buf:要设置或者获取的属性

key_t ftok(const char* pathname, int proj_id);
    功能:根据指定的路径名和int值,生成一个共享内存的key
    参数:
        -pathname 指定一个存在的路径
        -proj_id:int类型的值,但是系统调用只会使用其中的一个字节
            范围0-255,一般指定一个字符'a'


可以对共享内存进行多次删除 shmctl

因为shmctl是标记删除而不是直接删除,当共享内存关联的进程数为0时,真正意义上的删除

共享内存的key为0的时候,表示被标记删除

一个进程与共享内存取消关联,这个进程就不能再继续操作共享内存,也不能再次关联

共享内存和内存映射的区别:

1.共享内存可以直接创建,内存映射需要磁盘文件(匿名映射除外)

2.共享内存效果更好

3内存:

        所有的进程操作的是同一块共享内存

        内存映射,每个进程在自己的虚拟地址空间中有一个独立的存在

4.数据安全:

        -进程突然退出

                共享内存还存在

                内存映射区消失

        -电脑死机

                数据存在共享内存中,没有了

               内存映射区的数据,有天域磁盘文件中数据还在,所以内存映射区的数据还在

5.生命周期:

        内存映射区:进程退出,内存映射区销毁

        共享内存:进程退出,共享内存还在,手动删除(所有的关联的进程数为0)或者关机

                如果一个内存退出,会自动和共享内存取消关联

更多推荐

Python+selenium自动化生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner一、导入HTMLTestRunner1.这个模块下载不能通过pip安装了,只能下载后手动导入,下载地址:htt

使用Java中SSM技术写项目具体操作流程

确定需求和技术选型首先需要明确项目的功能需求,以及选择合适的技术框架和库。在SSM框架中,Spring框架负责管理Java对象,提供依赖注入和面向切面编程的功能;SpringMVC框架负责处理请求和响应,实现MVC架构;MyBatis框架负责ORM(对象关系映射),简化数据库操作。创建SpringMVC工程使用Mave

算法与设计分析--分治算法的设计与分析

某不知名学校的第二次算法实验报告,一共四道题全部来自力扣第一题​​​​​​169.多数元素题目描述:给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:[3,2,3]输出:3示例2:输入:[2,2,1,1,1

基于springboot会员制医疗预约服务管理信息系统springboot017

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行!🍅更多优质项目👇🏻👇🏻可点击下方获取🍅文章底部或评论区获取🍅Java项目精品实

CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)

A.MEXanizedArrayAC代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=210;inta[N];intn,k,x;voidsolve(){cin>>n>>k>>x;if(x<k-1){c

vue-cli-service build 不同环境的配置

目录🤜背景🤜vue-cli-service介绍🤜环境变量和模式🤜配置不同模式🤜index.html使用环境变量🤜验证🤜参考资料🤜背景在项目部署时,我们需要在测试环境和生产环境使用不同的变量。vue-cli提供了vue-cli-servicebuild打包命令,然而vue-cli-servicebuild

如何安装 Wnmp 并结合内网穿透实现外网访问内网Wnmp 服务

文章目录前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1注册账号3.2下载cpolar客户端3.3登录cpolarwebui管理界面3.4创建公网地址4.固定公网地址访问前言WNMP是Windows系统下的绿色Nginx+Mysql+PHP环境集成套件包,安装完成后即可得到一个Nginx+My

APP广告变现策略:如何实现盈利与用户体验的平衡?

如何把握流量变现和用户体验的平衡呢?这是许多APP开发者在商业化进程中都会关心并迫切需要解决的问题。以下是总结的一些方法和策略。一、深入了解用户需求在开发产品或进行商业决策时,我们要始终以用户需求为出发点。通过市场调研、用户调研和数据分析等方式,我们可以深入了解用户的需求和习惯,并以此为基础进行产品设计和优化。二、优化

文案内容千篇一律,软文推广如何加深用户印象

随着互联网技术的发展,企业营销的方式逐渐转向软文推广,但是现在软文推广的内容同质化越来越严重,企业应该如何让自己的软文推广保持差异性,在用户心中留下独特的印象呢?下面就让媒介盒子告诉你。一、&nbsp;找出产品独特卖点市场上同一类型的产品,缺点各有各的不同,但优点大同小异,因此我们需要找出产品独特卖点,将其表现出来,在

能进大厂?阿里云ACE认证到底有多香!

中国云计算火爆的当下,阿里云一枝独秀,市场占有率比排名后5名的总和还要多。在全球的云计算市场上,阿里云也是排名第三,超过谷歌云。这足以说明了市场对于阿里云产品解决方案的需求之大。而阿里云云计算架构师ACE认证是针对云架构师,解决方案架构师,云运维专家等技术人员的阿里云高级别技术认证。该认证体系已被阿里巴巴集团、交付伙伴

安卓恶意应用识别(三)(批量反编译与属性值提取)

前言上篇说到对安卓APK反编译,本篇实现批量反编译和批量特征提取及计算,主要就是通过python代码与cmd进行批量化交互,我在写文章之前,尝试批量下载了安卓apk(大约10来个),发现现在这个应用软件不是一般的大啊,无奈电脑内存不太够,现仅将已下载10个apk作为示例展示。1.批量反编译思路是这样:第一步:调用cmd

热文推荐