Linux共享内存

共享内存原理

简而言之,就是两个进程指向了同一块物理空间。(它们都能看到同一块内存
在这里插入图片描述
共享内存在内核中同时可以存在很多个,OS要管理所有的共享内存。
如何保证两个不同进程看到的是同一个共享内存呢???要给共享内存提供唯一性标识(后文提到的key)!!!
使用共享内存通信,一定是一个进程创建新的shm,另一个直接获取共享内存即可。

类比:共享内存 vs 文件操作
共享内存,如果进程结束,我们没有主动释放它,则共享内存一直存在。——共享内存的生命周期随内核。(除非重启系统,否则共享内存一直存在)。
文件操作,一个进程打开一个文件,进程退出时,这个被打开的文件就会被系统自动释放掉。——文件的生命周期随进程。

shmget 系统调用函数

#include <sys/ipc.h>
#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);

参数说明

第一个参数 key

1.这个key意义是什么?怎么形成的?
意义:标识共享内存的唯一性。
如何形成:由用户随意指定key值。

2.为什么要让用户传入?

#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);

参数由用户指定,由ftok函数的一套算法生成一个key,只要两个进程约定使用同样的字符串,同样的数字,就可以生成同样的key,从而标识同一块内存。

第二个参数 size

指定共享内存段的大小(以字节为单位)。如果是在获取一个已经存在的共享内存段,这个参数可以设置为 0。

注意在内核中共享内存的大小时以4kb为基本单位的。
例子:使用ipcs -m指令,查看共享内存。(这里申请了4096b大小)
在这里插入图片描述
开辟共享内存是向上取整的,例如申请1b,实际上申请了4096b,还有4095b不能使用被浪费了,申请4097b,实际上申请了2×4096b,还有4095b不能使用被浪费了。
所以建议申请大小为n×4 kb。

第三个参数 shmflg

IPC_CREAT:如果共享内存不存在就创建,如果共享内存已经存在,就直接获取它
IPC_EXCL:不能单独使用,没意义。
IPC_CREAT | IPC_EXCL:如果共享内存不存在就创建,如果共享内存已经存在,出错返回!(如果创建成功,一定是全新的共享内存)。
IPC_CREAT | 八进制权限:赋予权限。

关于共享内存的权限

在这里插入图片描述
使用shmget(key, size, IPC_CREAT | IPC_EXCL);
在这里插入图片描述
使用shmget(key, size, IPC_CREAT | IPC_EXCL| 0666);通过按位或的方式给共享内存加权限。
在这里插入图片描述
实际上第三个标志位的标志定义如下图,最右边三位始终是0,这就给权限位留出了空间。
在这里插入图片描述

删除共享内存

指令删除

ipc指令

ipcs 查看系统中指定用户创建的共享内存,消息队列,信号量。
在这里插入图片描述
ipcs -m 查看系统中指定用户创建的共享内存
在这里插入图片描述
使用 ipcrm -m shmid 删除共享内存

key vs shmid
key:在内核的角度,区分shm的唯一性。(类似于struct file*)
shmid指令级,代码级,最后对共享内存进行控制,用的都是shmid(类似于文件描述符fd)
shmdt

代码删除

shmctl系统调用函数

#include <sys/ipc.h>
#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);

第一个参数 int shmid:
共享内存的标识符

第二个参数 int cmd:
控制命令。常用的命令包括:

IPC_STAT: 获取共享内存段的状态信息,并将其存储在 buf 指向的 shmid_ds 结构中。
IPC_SET:
设置共享内存段的权限和其他属性(如 UID、GID、模式等),使用 buf 中的数据。
IPC_RMID:(用于删除共享内存)
标记共享内存段为已删除。当最后一个进程分离该共享内存段时,它将被真正删除。
IPC_INFO (Linux 特有):
获取系统级别的共享内存信息。 SHM_INFO (Linux 特有): 获取共享内存资源的使用情况。
SHM_STAT (Linux 特有): 类似于 IPC_STAT,但通过索引访问共享内存段。

第三个参数buf:获取共享内存的相关属性

  1. 指向 shmid_ds 结构的指针,用于存储或提供共享内存段的状态信息。
  2. 如果 cmdIPC_RMID,则可以设置为 NULL。

shmid_ds定义如下:

struct shmid_ds {struct ipc_perm shm_perm; // 权限信息size_t          shm_segsz; // 共享内存段的大小time_t          shm_atime; // 最后附加时间time_t          shm_dtime; // 最后分离时间time_t          shm_ctime; // 最后修改时间pid_t           shm_cpid;  // 创建进程的 PIDpid_t           shm_lpid;  // 最后操作进程的 PIDshmatt_t        shm_nattch; // 当前附加的进程数
}

返回值
成功时,返回值取决于 cmd:

  • 对于 IPC_STAT、IPC_SET 和 IPC_RMID,成功时返回 0。
  • 对于 IPC_INFO 和 SHM_INFO,返回内核中共享内存段的最大索引值。
  • 对于 SHM_STAT,返回共享内存段的标识符。

失败时,返回 -1,并设置 errno 来指示错误类型。

例子:
代码删除共享内存

void DeleteShm(int shmid)
{int n = shmctl(shmid, IPC_RMID, NULL);if (n < 0){cerr << "shmctl error" << endl;}else{cout << "shmctl delete shm success ,shmid: " << shmid << std::endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25836.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建gn环境踩坑存档

流程 1. 项目根目录下新增.gclient和.gclient_entries //.gclient solutions [{"name": "src","url": "","managed": False,"custom_deps": {},"custom_vars": {},}, ]// .gclient_entries entries …

CMU15445(2023fall) Project #3 - Query Execution(上)详细分析

晚日寒鸦一片愁 柳塘新绿却温柔 若教眼底无离恨 不信人间有白头 ——鹧鸪天 完整代码见&#xff1a; SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determination, we pre…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

知识图谱-资源网

知识图谱-资源网 http://openkg.cn/datasets-type/https://www.ownthink.com/knowledge.html

【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)

第二届边缘计算与并行、分布式计算国际学术会议&#xff08;ECPDC 2025&#xff09;将于2025年4月11日至13日在中国武汉盛大召开。本次会议旨在为边缘计算、并行计算及分布式计算领域的研究人员、学者和行业专家提供一个高水平的学术交流平台。 随着物联网、云计算和大数据技术…

【Qt】MVC设计模式

目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层&#xff0c;关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…

Grok3使用体验与模型版本对比分析

文章目录 Grok的功能DeepSearch思考功能绘画功能Grok 3的独特功能 Grok 3的版本和特点与其他AI模型的比较 最新新闻&#xff1a;Grok3被誉为“地球上最聪明的AI” 最近&#xff0c;xAI公司正式发布了Grok3&#xff0c;并宣称其在多项基准测试中展现了惊艳的表现。据官方消息&am…

Pytest测试用例执行跳过的3种方式

文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中&#xff0c;我们可能某条测试用例没写完&#xff0c;代码执行时会报错&#xff0c;或者是在一些条件下不让某些…

DeepSeek开源周Day5: 3FS存储系统与AI数据处理新标杆

项目地址&#xff1a; GitHub - deepseek-ai/3FS: A high-performance distributed file system designed to address the challenges of AI training and inference workloads.GitHub - deepseek-ai/smallpond: A lightweight data processing framework built on DuckDB and…

什么是多线程?线程池?

文章目录 一、什么是多线程&#xff1f;二、多线程的实现方法1. 继承Thread类,重写run方法2. 实现Runnable接口&#xff0c;并创建Thread对象3. Callable和Future 三、线程的5种状态**New&#xff08;新创建&#xff09;****Runnalbe(可运行)****Running****Blocked(阻塞)****等…

MES生产制造执行管理系统(源码+配套文档)

在当今竞争激烈的制造业环境中&#xff0c;企业要想保持竞争优势&#xff0c;就必须不断提升生产效率、优化管理流程。MES&#xff08;制造执行系统&#xff09;作为连接上层计划管理与底层工业控制的桥梁&#xff0c;正逐渐成为众多制造企业转型升级的关键工具。一个功能全面的…

AI伦理挑战:如何确保技术发展符合道德规范?

引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们正迎来一个前所未有的数字化时代。AI的应用已经渗透到医疗、教育、金融、交通等众多领域&#xff0c;极大地推动了生产效率的提升&#xff0c;改善了人们的生活质量。从智能医疗诊断到自动驾驶汽车…

Qt 自带颜色属性

Qt 系统自带颜色如下&#xff1a; enum GlobalColor {color0,color1,black,white,darkGray,gray,lightGray,red,green,blue,cyan,magenta,yellow,darkRed,darkGreen,darkBlue,darkCyan,darkMagenta,darkYellow,transparent};对应颜色如下&#xff1a; color0: 这是自定义颜色…

MySQL慢查询分析与处理

什么是慢日志 慢日志是MySQL用来记录数据库中执行较慢的SQL语句的日志&#xff0c;当数据库遇到性能问题时&#xff0c;慢日志可以帮助我们分析数据库中执行较慢的SQL。 如何打开数据库慢日志功能 MySQL默认是关闭慢日志功能的&#xff0c;可以从数据库中或者从配置文件中进行…

深度学习基础--ResNet50V2网络的讲解,ResNet50V2的复现(pytorch)以及用复现的ResNet50做鸟类图像分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;作者又进行修改&#xff0c;命名为ResNe50v2&#xff0c…

TikTok隐私保护措施:确保用户安全

TikTok隐私保护措施&#xff1a;确保用户安全 在这个信息爆炸的时代&#xff0c;社交媒体平台的隐私保护问题日益成为公众关注的焦点。TikTok&#xff0c;作为全球领先的短视频平台&#xff0c;拥有庞大的用户群体&#xff0c;因此&#xff0c;其隐私保护措施显得尤为重要。本…

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站&#xff1a;About FFmpeg 1 库介绍 &#xff08;1&#xff09;libavutil是一个包含简化编程函数的库&#xff0c;包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 &#xff08;2&#xff09;libavcodec是一个包含音频/视频编解码器的解码器和编…

【Redis】Mac系统一键安装redis

要在 macOS 上一键安装 Redis&#xff0c;可以使用 Homebrew&#xff08;一个流行的包管理工具&#xff09;来简化安装过程。下面是可以执行的安装脚本&#xff1a; 安装脚本&#xff1a; #!/bin/bash# 检查 Homebrew 是否已安装&#xff0c;如果没有安装&#xff0c;则安装 …

P1149 [NOIP 2008 提高组] 火柴棒等式c/c++

P1149 [NOIP 2008 提高组] 火柴棒等式c/c 题目描述 给你 n 根火柴棍&#xff0c;你可以拼出多少个形如 ABC 的等式&#xff1f;等式中的 A、B、C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 0&#xff09;。用火柴棍拼数字 0∼9 的拼法如图所示&a…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…