Linux操作系统4-进程间通信4(共享内存原理,创建,查看,命令)

news2025/2/22 7:28:01

上篇文章:Linux操作系统4-进程间通信3(基于管道的进程池设计)-CSDN博客

本篇Gitee代码:myLerningCode/l24 · 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com)

本篇重点:使用共享内存来实现两个进程之间的通信

一. 共享内存的原理

        两个进程想要通信,需要让两个进程看到(访问)同一份资源或者空间。管道文件是内存级文件,可以让不同的进程进程访问。

        而共享内存的原理是

1 在物理内存中申请一块中间

2 将创建好的内存通过文件页表映射道两个进程的虚拟地址空间中,这样两个进程就能够进行通信(称为进程与共享内存的挂接)

3 不需要通信了,取消共享内存和进程虚拟地址空间的映射关系(去关联)然后师释放共享内存

        共享内存是一种通信方式,所有想要通信的进程都可以使用。且OS中一定存在一个或者多个共享内存用于进程的通信。

两个进程通过共享内存进行通信的示意图如下 :

共享内存:让不同的进程可以看到同一块物理内存

二. 共享内存的创建 

2.1 系统调用shmget

        这个系统调用帮助我们在物理内存中创建一个共享内存。

//所需头文件
#include <sys/ipc.h>
#include <sys/shm.h>

//shmget 用于获取一个共享内存段
int shmget(key_t key, size_t size, int shmflg)

//参数介绍
size:   创建共享内存的大小,单位是字节

shmflg: 标志位,类似与我们的open
IPC_CREAT    如果创建的共享内存不存在,就会创建,若存在就会获取这个共享内存
IPC_EXCL     单独使用无意义
IPC_CREAT | IPC_EXEL    共享内存不存在就会创建,如果存在就会出错返回。一般用于第一次创建共享内存
我们使用的时候一般需要加上 0666用于更改权限

key: 用于保证共享内存的唯一性,不同的key就会创建不同的共享内存

返回值:成功返回标识符,失败返回-1

2.2 ftok获取key值

头文件
#include <sys/types.h>
#include <sys/ipc.h>

//函数原型
key_t ftok(const char* name, int proj_id)

//将一个项目名为name,标识符为proj_id转化为一个 System V 的key
如果两个进程的name和proj_id是一样的,那么它们创建的共享内存就是一样的

成功返回key,失败返回-1

2.3 创建共享内存代码与示例 

示例代码如下:

#include <iostream>
#include <cassert>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

// 当前的绝对路径用于获取key
#define PATHNAME "."
#define PROJ_ID 2025221

int main()
{
    // 获取一个key
    key_t key = ftok(PATHNAME, PROJ_ID);
    assert(key != -1);
    // 打印key
    printf("0x%x\n", key);

    //创建共享内存
    int sid = shmget(key,1024,IPC_CREAT | IPC_EXCL | 0666);
    assert(sid != -1);

    return 0;
}

运行结果如下:

        可以看到,一个OS中,可能存在非常多的共享内存,为了标识这个共享内存的唯一性,我们需要使用一个key来创建共享内存。

        共享内存 = 物理内存 + 共享内存相关属性

key既保证了共享内存的唯一性,两个进程也能通过key值来关联同一个共享内存以便通信

三. 使用命令查看和删除共享内存 

3.1 查看命令 ipcs -m

        ipcs 这个命令是用于查看System V 的资源的。

如下图:

上图中依次是消息队列,共享内存,信号量

如果只需要查看共享内存只需要使用 ipcs -m 即可。

如下图:

 上图就是我们使用test创建的一个共享内存。

        为什么我们的进程退出了,共享内存还在呢?

这是因为共享内存是OS进行管理的,生命周期随OS而不随创建它的进程

3.2 删除命令 ipcrm -m 

        使用 ipcrm -m + 共享内存的shmid 即可删除这个共享内存

如下图:

        key可以唯一标识一个共享内存,我们为什么不用key去删除而是用shmid去删除这个共享内存呢?

        因为key由OS管理,用户无法操作。 

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

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

相关文章

使用Ubuntu搭建Java部署环境

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:小舟从此逝&#xff0c;江海寄余生&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小…

MATLAB学习之旅:从入门到基础实践

在当今科技飞速发展的时代,MATLAB作为一款强大的数学软件,犹如一把神奇的钥匙,能够打开众多领域的大门。无论是工程计算、数据分析,还是算法开发、可视化呈现,MATLAB都展现出了无与伦比的魅力。今天,就让我们踏上这段奇妙的MATLAB学习之旅,从最基础的部分开始,逐步探索…

蓝桥杯核心内容

核心内容 数学 质数与筛质数&#xff0c;分解质因数 分解质因数 所有的数都可以写成有限个数相乘质数&#xff1a;可以写成1✖本身&#xff08;如131✖13&#xff09;合数&#xff1a;ab1✖...✖bn-》把乘数里面是合数的再分&#xff08;如b3是合数-》b3c1✖c2&#xff09;进…

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…

金融时间序列【量化理论】

业界常用的技术分析指标都与价格本身有关&#xff0c;而时间序列分析由于对数据平稳性的要求常常是基于收益率这样更加偏稳定的数据&#xff08;收益率由于会涨停和跌停每天最多10%&#xff09; 平稳性&#xff1a; 强平稳性&#xff1a;随时间变化&#xff0c;各个统计特征都…

快速入门——第三方组件element-ui

学习自哔哩哔哩上的“刘老师教编程”&#xff0c;具体学习的网站为&#xff1a;10.第三方组件element-ui_哔哩哔哩_bilibili&#xff0c;以下是看课后做的笔记&#xff0c;仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据&#xff0c;也可由父组件通过prop方式传…

Qt5 C++ TcpSocket 如何判断是服务主动断开tcp socket连接?

文章目录 实现思路示例代码代码解释主要功能和用法注意事项 在 Qt 5.9.9 的 C 开发中&#xff0c;使用 QTcpSocket 时&#xff0c;要判断是服务端主动断开 TCP Socket 连接&#xff0c;可以通过处理 QTcpSocket 的 disconnected 信号&#xff0c;结合 QTcpSocket 的状态以及…

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机&#xff0c;主要为上下级控制系统之间的广域网通信提供认证与加密服务&#xff0c;实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证&#xff1a;对接入的设备和用户…

Datawhale Ollama教程笔记5

Dify 接入 Ollama 部署的本地模型 Dify 支持接入 Ollama 部署的大型语言模型推理和 embedding 能力。 快速接入 下载 Ollama 访问 Ollama 安装与配置&#xff0c;查看 Ollama 本地部署教程。 运行 Ollama 并与 Llama 聊天 ollama run llama3.1Copy to clipboardErrorCopied …

保姆级! 本地部署DeepSeek-R1大模型 安装Ollama Api 后,Postman本地调用 deepseek

要在Postman中访问Ollama API并调用DeepSeek模型&#xff0c;你需要遵循以下步骤。首先&#xff0c;确保你有一个有效的Ollama服务器实例运行中&#xff0c;并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级&#xff01;使用Ollama本地部署DeepSeek-R1大模型 并java…

ASP.NET Core 下载文件

本文使用 ASP .NET Core&#xff0c;适用于 .NET Core 3.1、.NET 5、.NET 6和.NET 8。 另请参阅&#xff1a; 如何在将文件发送到浏览器后自动删除该文件。 如何将文件从浏览器上传到服务器。 如何在 ASP.NET Core 应用程序中从 URL/URI 下载文件。 如果使用.NET Framework&am…

【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一(24分)【问题1】(6分)【问题2】(10分)【问题3】(8分)试题二(26分)【问题1】(8分)【问题2】(8分)【问题3】(4分)【问题4】(6分)试题三(25分)【问题1】(12分)【问题2】(7分)【问题…

原来DeepSeek还能运用在系统集成-领星对接

在当今数字化转型的浪潮中&#xff0c;企业的信息化建设已成为提升运营效率、优化管理流程的关键。领星ERP与金蝶云星空作为两款在电商和财务管理领域广受欢迎的软件&#xff0c;其数据对接对于跨境电商企业来说尤为重要。本文将结合实际应用场景&#xff0c;深度解析如何通过轻…

在windows下安装windows+Ubuntu16.04双系统(上)

这篇文章的内容主要来源于这篇文章&#xff0c;给文章很详细的介绍了如何从windows下安装windowsubuntu16.04双系统。我刚开始装双系统都是参照这个方法&#xff0c;该作者前后更新了两个版本&#xff0c;在这里对其稍微进行整理一下。 一、准备&#xff1a;&#xff08;这里推…

第37章 合作之路与占坑成功

在春寒料峭的时节&#xff0c;那丝丝寒意宛如一缕缕若有若无的轻烟&#xff0c;在空气中悄然弥漫。锐创所的会议室&#xff0c;宛如一个被岁月尘封的神秘空间&#xff0c;暖黄色的灯光晕染开来&#xff0c;像是为整个房间披上了一层朦胧的薄纱&#xff0c;陈旧却又带着几分温馨…

杰和科技GAM-AI视觉识别管理系统,让AI走进零售营销

在数字化浪潮席卷全球零售业的今天&#xff0c;如何精准触达顾客需求、优化运营效率、提升门店业绩&#xff0c;成为实体商业破局的关键。 GAM-AI视觉识别管理系统 杰和科技智能零售管理系统&#xff1a;GAM-AI视觉识别管理系统&#xff0c;以AI视觉识别大数据分析边缘计算为核…

golang内存泄漏

golang也用了好几年了&#xff0c;趁着有空 整理归纳下&#xff0c;以后忘了好看下 一般认为 Go 10次内存泄漏&#xff0c;8次goroutine泄漏&#xff0c;1次是真正内存泄漏&#xff0c;还有1次是cgo导致的内存泄漏 1:环境 go1.20 win10 2:goroutine泄漏 单个Goroutine占用内存&…

Redis存储⑩Redis的事务_弱化的原子性

目录 1. MySQL和Redis事务的区别 1.1 MySQL的事务 1.2 Redis的事务 2. Redis事务操作 2.1 MULTI multi 2.2 EXEC exec 2.3 DISCARD discard 2.4 WATCH 1. MySQL和Redis事务的区别 1.1 MySQL的事务 MySQL事务复习&#xff1a; MySQL数据库⑨_事务&#xff08;四个属性…

基于Flask的京东商品信息可视化分析系统的设计与实现

【Flask】基于Flask的京东商品信息可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统能够灵活地执行SQL查询&#xff0c;提取出用于分析的关键数据指标。为了将这…