Linux共享内存

news2024/11/17 7:52:47

在这里插入图片描述

博客内容:共享内存


文章目录

  • 一、认识共享内存结构
  • 二、如何创建共享内存?
    • 1.创建共享内存
    • 2.关联进程,取消进程
    • 3.释放共享内存
  • 三、代码示例
  • 总结


一、认识共享内存结构

共享内存

共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。

在这里插入图片描述
解释比较官方,对于进程来说就是PCB,内存描述符(mm_struct)、页表,还有内存之间的关系。简单的描述后就是以下这样的方式。对于内存描述符类似于文件描述符。共享内存是为了让不同的进程实现通信,就必须先让不同的进程来看见同一份资源
在这里插入图片描述

二、如何创建共享内存?

1.创建共享内存

使用共享内存需要知道这些接口,创建函数接口

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

共享内存是哪块,有多大,权限设置。第一个参数就是对于内存位置来表示内存的key。ftok函数就是采用路径和项目名来生成一个不易于冲突的一个key值。

 #include <sys/types.h>
  #include <sys/ipc.h>

  key_t ftok(const char *pathname, int proj_id);

第二个参数就是设置大小。对于后面第3个参数shmflg就是设置权限,权限和文件操作的权限采用的都是位图的数据结构来表示。

2.关联进程,取消进程

共享内存的创建完成后还需要让进程看见,需要将进程与内存关联在一起,摩天大厦也需要和自己挂钩才是自己的。所以就有函数shmat、shmdt。


       void *shmat(int shmid, const void *shmaddr, int shmflg);

       int shmdt(const void *shmaddr);

分别实现对于进程的关联和去关联。关联同一块内需要同样的key才能看见同一块内存。shmat第二个参数一般设置为null,函数会自己找到合适的地址。函数使用时与C语言的malloc类似都需要进行内存的一个转换,shmdt去关联时函数需要传入的是空间地址。就是shmat的返回值。在shmat与shmat之间就是通信的内容。

3.释放共享内存

共享内存是一套类似于文件描述符的规则,它不会随着进程而销毁,它跟随的是OS。所以在使用完后还需要使用函数进行销毁内存空间。使用函数进行空间释放后对于需要传输的是shmid就是使用函数shmget后的返回值,第二个参数就是命令IPC_RMID ,第3个参数一般设置为null。

  int shmctl(int shmid, int cmd, struct shmid_ds *buf);

三、代码示例

创建一个共享内存,实现通信 “i am process A”

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

#define SHM_SIZE 4096

int main()
{
    key_t key = ftok(".", 'a');
    int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
    char *shmaddr = (char *) shmat(shmid, NULL, 0);

    pid_t pid = fork();
    if (pid < 0) {
        printf("Fork Error\n");
        return -1;
    } else if (pid == 0) {  // 子进程
        char *data = "i am process A";
        memcpy(shmaddr, data, strlen(data));
    } else {  // 父进程
        usleep(100000);  // 等待子进程写入数据
        printf("%s\n", shmaddr);
        shmdt(shmaddr);
        shmctl(shmid, IPC_RMID, NULL);
    }

    return 0;
}


总结

需要注意的就是函数的返回值需要进行判断。在通信时使用是字节流通信。相关查询命令

		ipcs -m//查询共享内存
		ipcs -q//消息队列
		ipcs -s         //查看信号量对象
       ipcrm -Q key :根据键值key,删除指定的消息对列

        ipcrm -q id     :根据ID,删除指定的消息对列

        ipcrm -M key :根据键值key,删除指定的共享内存

        ipcrm -m id     :根据ID,删除指定的共享内存

        ipcrm -S key :根据键值key,删除指定的信号量

        ipcrm -s id     :根据ID,删除指定的信号量

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

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

相关文章

新手速成!如何使用ChatGPT成为你的导师

1. 写在前面 最近我发现咱们的团队现在是人手ChatGPT&#xff0c;不光是我们团队&#xff0c;我整个行业的人都在用它解决生活跟工作中遇到的问题。可以看到的是大家也都是对它赞赏度很高 本文我将为大家介绍如何更加高效的使用ChatGPT提高工作效率&#xff0c;面向ChatGPT编程…

JavaScript高级学习总结

函数作用域 函数内部声明的变量&#xff0c;在函数外部无法被访问函数的参数也是函数内部的局部变量不同函数内部声明的变量无法互相访问函数执行完毕之后&#xff0c;函数内部的变量实际被清空了 块作用域 let声明的变量会产生块作用域&#xff0c;var不会产生块作用域cons…

QT +OpenSSL配置

QT OpenSSL配置 1 查看自己QT支持的OPenSSL版本号1.1 查看版本号1.2 是否配置了OPenSSL 2 安装OPenSSL2.1 下载已经编译好的库2.2 自己编译代码2.2.1 下载perl2.2.1 下载OPenSSL源码 1 查看自己QT支持的OPenSSL版本号 1.1 查看版本号 新建项目testOpenSSLpro文件中加入QT ne…

(贪心) 649. Dota2 参议院 ——【Leetcode每日一题】

❓ 649. Dota2 参议院 难度&#xff1a;中等 Dota2 的世界里有两个阵营&#xff1a;Radiant&#xff08;天辉&#xff09;和 Dire&#xff08;夜魇&#xff09; Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过…

Debian11 dhclient 不自动执行问题

这两天用U盘安装Debian11&#xff0c;在”安装软件“一直提示失败&#xff0c;但可以跳过这一步继续往下安装&#xff0c;好在基本系统及grub能正常安装&#xff0c;最后系统也能正常起来了&#xff0c;但发现系统起来后没有ip地址&#xff0c;需要手动执行 dhclient 来获取ip。…

Java的第十二篇文章——集合

目录 第十二章 集合 学习目标 1. 集合框架的由来 2. 集合框架的继承体系 3. Collection接口 3.1 Collection接口的常用方法 4. Iterator接口 4.1 Iterator接口的抽象方法 4.2 获取迭代器接口实现类 4.3 迭代器的实现原理 4.4 并发修改异常 4.5 集合存储自定义对象并…

【Git常用命令及在IDEA中的使用】

Git常用命令及在IDEA中的使用 Git常用命令及在IDEA中的使用1 Git 概述1.1 Git 简介1.2 Git 下载与安装 2 Git 代码托管服务2.1 常用的Git 代码托管服务2.2 使用码云代码托管服务 3 Git 常用命令3.1 Git 全局设置3.2 获取 Git 仓库3.3 工作区、暂存区、版本库 概念3.4 Git工作区…

MyBatis面试题总结

1.概念/使用方法向的问题 1.1 什么是Mybatis? &#xff08;1&#xff09;Mybatis是一个半ORM框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 &#xff08;2&a…

​​​​SpringBoot 监控神器——Actuator 保姆级教程

pom.xml info beans conditions heapdump shutdown mappings threaddump loggers 端点 metrics 端点 自定义Endpoint 自定义监控端点常用注解 使用Filter对访问actuator做限制 Spring Boot Monitor做监控页面 SpringBoot自带监控功能Actuator&#xff0c;可以帮助…

Kubernetes学习笔记-kubernetes应用扩展(2)-使用kubernetes服务目录扩展kubernetes20230623

一、服务目录介绍 服务目录就是列出所有的服务的目录。用户可以浏览目录并自行设置目录中列出的服务实例&#xff0c;无须处理服务运行所需的pod、service、configmap和其他资源。这听起来和自定义网站资源很类似。 服务目录并不会为每种服务类型的api服务器添加自定义资源&a…

全栈开发实战那些事

文章目录 一个网站是怎么来的&#xff1f; Git篇隔离项目和原有Git工程联系Git冲突的原因通常有以下几种&#xff1a; IDEA篇IDEA常用操作Git可视化操作&#xff08;提交代码前先pull更新merge最新版本一下再push&#xff0c;保证提交的最终项目是最新&#xff09; IDEA中Git冲…

Jenkins 发送文件到远程服务器:Publish Over SSH 插件

Jenkins 发送文件到远程服务器&#xff1a;Publish Over SSH 插件 文章目录 Jenkins 发送文件到远程服务器&#xff1a;Publish Over SSH 插件一、Publish Over SSH 插件1、概述2、主要功能和特点3、插件主页4、安装 Publish Over SSH 插件5、配置远程主机 二、发送文件到远程主…

Python基础篇(七):面向对象的编程思想

面向对象 前言1. 面向对象编程思想1.1 面向对象的相关概念1.2 面向对象的三大特性 2. 类的定义2.1 使用class关键字定义类2.2 创建类对象并调用属性和方法 3.面向对象思想示例3.1 详细示例&#xff1a;图形类的设计3.2 基类 Shape3.3 子类 Circle3.4 子类 Rectangle3.5 使用图形…

【Java-SpringBoot+Vue+MySql】Day5-前端进阶

目录 一、Axios网络请求 中文文档&#xff1a; 安装&#xff1a; 导入&#xff1a; 使用方法&#xff1a; 基本语法&#xff1a; 生命周期函数&#xff1a; 二、前端路由VueRouter 视频&#xff1a;12.前端路由VueRouter_哔哩哔哩_bilibili 参考文档: 三、状态管理VueX …

Linux设备驱动程序(三)——字符驱动

文章目录 前言一、scull 的设计二、主设备号和次设备号1、设备编号的内部表达2、分配和释放设备编号3、主编号的动态分配 三、一些重要的数据结构1、文件操作&#xff08;file_operation&#xff09;2、文件结构&#xff08;struct file&#xff09;3、inode 结构 四、字符设备…

【软件设计师暴击考点】黄金五题套路拿

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

AutoSAR系列讲解(入门篇)2.1-AppL概述

AppL概述 开局一张Autosar的框架图&#xff1a; 一、AppL的组成 二、先来举个例子 三、SWC的通信 四、SWC的分配 开局一张Autosar的框架图&#xff1a; 一、AppL的组成 AppL中最重要的就是SWC了&#xff0c;而SWC与其他SWC通信需要接口&#xff0c;每个SWC中又由runnable…

【C++篇】OOP上部分:封装类和对象

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

C++【STL】之反向迭代器

反向迭代器 前面在vector和list的模拟实现中都有讲到正向迭代器&#xff0c;今天我们就来讲解一下反向迭代器的思想和模拟实现&#xff0c;在某些场景下还是很实用的&#xff0c;下面正文直接开始。 文章目录&#xff1a; 反向迭代器1. 反向迭代器结构2. 反向迭代器实现2.1 多…

一起学AI:核心基础概念

一起学AI&#xff1a;核心基础概念 AI基础概念什么是学习率&#xff1f;batchsize和epoch分别是什么&#xff1f;梯度消失与梯度爆炸是什么&#xff1f;什么是过拟合、欠拟合和泛化&#xff1f;归一化、正则化、标准化是什么&#xff1f;线性回归和逻辑回归是什么&#xff1f;神…