【Linux:共享内存】

共享内存的概念: 

  • 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中
  • 共享内存是由需要通信的双方进程之一来创建
  • 但该资源并不属于创建它的进程,而属于操作系统 
  • 共享内存可以在系统中存在多份,供不同个数,不同进程进行通信
  • 因此共享内存一定会存在一个数据结构来对共享内存进行管理
  • 共享内存=内存空间(数据)+共享内存的属性

共享内存的相关接口:

  • key:由用户形成,具有唯一性(内核区分shm的唯一性的),内核使用的一个字段,用户不能用Key来进行shm的管理
  • size:共享内存的大小
  • shmflg:标记位,可以用位图传参,认识它中的两个宏:IPC_CREAT和IPC_EXCL
  1. IPC_CREAT:创建的共享内存不存在就创建,存在则获取该共享内存并返回
  2. IPC_CREAT|IPC_EXCL:创建的共享内存不存在就创建,存在则出错返回
  3. IPC_EXCL:单独使用没有意义

共享内存不随着进程的结束就释放,因为共享内存不属于进程而属于操作系统,需要手动释放或者后续其它系统调用。共享内存的生命周期随内核。

查共享内存的命令:

ipcs -m

删除共享内存的命令:

ipcrm -m shmid

共享内存测试代码:

#ifndef __SHM_HPP__
#define __SHM_HPP__
#include <iostream>
#include <cerrno>
#include <cstdio>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
const std::string pathname = "/home/dl/pipe/shm";
int proj_id = 0x66;
const int Creater = 1;
const int User = 2;
const int CreatShmsize=4096;class shm
{
private:// 获取共享内存int GetShmhelper(key_t key, int size, int flag){int shmid = shmget(key, size, flag);if (shmid < 0){perror("shmget");}return shmid;}//获取Keykey_t GetcommKey(){key_t k = ftok(_pathname.c_str(), _proj_id);if (k < 0){perror("ftok");}return k;}
private:key_t _key;int _shmid;std::string _pathname;int _proj_id;int _who;
public:shm(const std::string &pathname, int proj_id, int who): _pathname(pathname),_proj_id(proj_id), _who(who){_key=GetcommKey();//获取共享内存都需要该参数,因此直接在构造时生成即可std::cout<<"shmid:"<<_shmid<<std::endl;std::cout<<"key:"<<TOHex(_key)<<std::endl;std::cout<<"who:"<<_who<<std::endl;}~shm(){if(_who==Creater){int res=shmctl(_shmid,IPC_RMID,nullptr);std::cout<<"shm remove done"<<std::endl;}}std::string TOHex(key_t key){char buffer[128];snprintf(buffer, sizeof(buffer), "0x%x", key);return buffer;}bool GetShmCreater(){//判断是否为创建者if(_who==Creater){int shmid = GetShmhelper(_key,CreatShmsize,IPC_CREAT|IPC_EXCL);if(shmid>0)std::cout<<"shm creat done"<<std::endl;sleep(5);return true;}return false;}bool GetShmUse(){//判断是否为使用者if(_who==User){int shmid = GetShmhelper(_key,CreatShmsize,IPC_CREAT);if(shmid>0)std::cout<<"shm get done"<<std::endl;return true;}return false;}};#endif

 


 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Google SERP API 对接说明

Google SERP API 对接说明 Google SERP&#xff08;Search Engine Results Page&#xff09;是用户在Google搜索引擎中输入查询后看到的结果页面。它显示自然搜索结果、广告、特色摘要、知识图谱以及图片、视频等多种内容&#xff0c;旨在为用户提供最相关的信息。 本文将详细…

心觉:成功学就像一把刀,有什么作用关键在于使用者(二)

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作174/1000天 上一篇文章讲了成功学到底是个啥 是如何起作用的 为什么有些人觉得没有用&#xff1f; 今天我们再展开来剖析一下这…

运维监控专项学习笔记-id:0-需求场景、监控作用、监控能力

参考来源&#xff1a; 极客时间专栏-运维监控系统实战笔记&#xff0c;作者&#xff1a;秦晓辉 一、需求场景 学习监控知识&#xff0c;得先了解为什么&#xff0c;也就是监控是因何产生的&#xff0c;解决了什么问题&#xff0c;有哪些典型的方案&#xff0c;分别有什么优缺…

转行大模型开发:挑战与机遇,如何有效学习以实现职业转变

前言 甚至随着技术的进步&#xff0c;我们每个人都可能面临失业风险&#xff0c;因为未来我们所处的整个行业都可能被颠覆&#xff0c;公司也会不复存在。司机这一职业就是随着科技发展而不断演进的典型案例&#xff0c;从最早的马车夫&#xff0c;到现在的汽车驾驶员&#xf…

前端学习杂乱记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Html二、CSS1. BFC布局2. 定位总结3. 动画1. transform变换2. transition过渡3. keyframes 和 animation 3. 伸缩盒模型&#xff1a;flex布局 三、JS1. 逻辑中断…

Aigtek功率放大器能应用哪些行业

功率放大器是一种在各个行业中发挥关键作用的技术设备&#xff0c;其应用涉及广泛&#xff0c;包括但不限于以下几个主要领域&#xff1a; 1.医疗行业&#xff1a; 在医疗领域&#xff0c;功率放大器常用于医学超声成像系统。超声波传感器通过发射和接收声波&#xff0c;生成图…

prime1靶机渗透 (信息收集 内核提权)

靶机信息 vulnhub靶机 prime1 主机发现 -sn 是scan and no port hack 只用于主机发现 ┌──(kali㉿kali)-[~] └─$ sudo nmap -sn 192.168.50.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-09 02:25 EDT Nmap scan report for 192.168.50.1 Host is up …

【RabbitMQ】重试机制、TTL

重试机制 在消息从Broker到消费者的传递过程中&#xff0c;可能会遇到各种问题&#xff0c;如网络故障、服务不可用、资源不足等&#xff0c;这些问题都可能导致消息处理失败。为了解决这些问题&#xff0c;RabbitMQ提供了重试机制&#xff0c;允许消息在处理失败之后重新发送…

Mac使用技巧-来自苹果专人在线辅导服务

好记性不如烂笔头 跟着技术人员从头到尾操作了一遍&#xff0c;发现应该跟人家学习的时候&#xff0c;是很容易接受并接收知识点的&#xff0c;但发现还是要做一下笔记&#xff0c;好记性不如烂笔头。 用来用去&#xff0c;感觉Mac更适合不搭配鼠标使用&#xff0c;因为鼠标的滑…

行业内幕!宠物浮毛对肺的危害大?实测霍尼韦尔、有哈、希喂除浮毛哪家强?

我有一个医生朋友&#xff0c;他常常给身边的朋友科普养猫、养狗、养宠物掉下来的毛发对呼吸道健康的影响。 看到身边的朋友养猫心痒痒&#xff0c;听他讲完又时刻担心着宠物毛发对呼吸道健康的危害。一直犹犹豫豫没下决心去接猫&#xff0c;直到前段时间过生日&#xff0c;朋…

CAFE: Catastrophic Data Leakage in Vertical Federated Learning(纵向联邦学习)

NeurIPS 2021 发表单位&#xff1a;美国伦斯勒理工学院、IBM研究院、国立阳明交通大学 GitHub&#xff1a;https://github.com/DeRafael/CAFE 摘要&#xff1a; 梯度共享机制&#xff08;批处理&#xff09;会泄露私有数据—>提出数据泄露攻击CAFE—>提出缓解CAFE对策 在…

Python redis 安装和使用介绍

python redis安装和使用 一、Redis 安装1.1、Windows安装 二、安装 redis 模块二、使用redis 实例1.1、简单使用1.2、连接池1.3、redis 基本命令 String1.3.1、ex - 过期时间&#xff08;秒&#xff09;1.3.2、nx - 如果设置为True&#xff0c;则只有name不存在时&#xff0c;当…

华为、思科、新华三,三大厂商认证到底选择哪一个?

在计算机网络行业&#xff0c;华为、思科和新华三的认证被广泛认可&#xff0c;成为从业者提升技能和职业竞争力的重要凭证。 然而&#xff0c;面对这三大厂商的认证&#xff0c;很多人感到困惑&#xff0c;不知道该选择哪一个。 本文将详细介绍这三大认证体系&#xff0c;帮助…

【学术会议征稿】第四届电子信息工程与计算机技术国际学术会议(EIECT 2024)

第四届电子信息工程与计算机技术国际学术会议&#xff08;EIECT 2024&#xff09; 2024 4th International Conference on Electronic Information Engineering and Computer Technology 随着科学技术的高速发展&#xff0c;计算机技术革新日新月异&#xff0c;其智能化、网络…

Spring中存储Bean的常见注解

目录 IoC & DI IOC&#xff08;控制反转&#xff09;详解 依赖注入的三种方式 IoC & DI IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 控制反转&#xff1a;也就是控制权反转. 什么的控制权发⽣了反转? 获得依赖对…

计算机毕业设计污染物文献共享数据库管理系统网站开发与实现

计算机毕业设计&#xff1a;污染物文献共享数据库管理系统网站开发与实现 1. 项目背景 随着环境问题日益严峻&#xff0c;对污染物的研究变得尤为重要。然而&#xff0c;在学术界和工业界之间存在着信息孤岛现象&#xff0c;即大量的研究成果被分散在不同的数据…

每日OJ题_牛客_除2!(贪心+堆)

目录 牛客_除2&#xff01;&#xff08;贪心堆&#xff09; 解析代码 牛客_除2&#xff01;&#xff08;贪心堆&#xff09; 除2&#xff01;_牛客题霸_牛客网 解析代码 弄一个堆模拟一下&#xff0c;用到贪心的思想&#xff0c;记得开long long&#xff0c;否则可能0分。 …

Python中的异步编程:从基础知识到高级应用

随着互联网应用的不断发展&#xff0c;高并发和高性能成为越来越多开发者关注的重点。Python 3.5引入了asyncio库和async/await语法&#xff0c;使得异步编程变得更加简洁和高效。本文将详细介绍Python中的异步编程&#xff0c;从基础知识到高级应用&#xff0c;帮助你掌握这一…

【AI大模型】LLM主流开源大模型介绍

目录 &#x1f354; LLM主流大模型类别 &#x1f354; ChatGLM-6B模型 2.1 训练目标 2.2 模型结构 2.3 模型配置(6B) 2.4 硬件要求 2.5 模型特点 2.6 衍生应用 &#x1f354; LLaMA模型 3.1 训练目标 3.2 模型结构 3.3 模型配置&#xff08;7B&#xff09; 3.4 硬件…

ROS第四梯:ROS项目中添加自定义类

第一步&#xff0c;ROS项目结构介绍 工作空间中包含一个名为pcl_ros_test的功能包&#xff0c;其中main.cpp是原有项目自带的&#xff0c;接下来以CommonAlg自定义类添加为例进行介绍。 第二步&#xff1a;头文件CommonAlg.h创建和编写&#xff0c;并保存在include/pcl_ros_tes…