首页 > 系统相关 >系统编程-共享内存

系统编程-共享内存

时间:2024-08-28 19:53:26浏览次数:6  
标签:共享内存 函数 映射 -- 编程 系统 int include

共享内存

目录

共享内存

引入

一、使用指令查看共享内存

二、使用共享内存进行通信的步骤

1、获取键值

2、创建或获取共享内存 id

3、映射共享内存到进程的地址空间

4、进行数据的写入和读取        

 -- memcpy

5、对“块”进行赋值操作

5、解除映射

6、共享内存的多种操作函数


引入

  • system V中进程间通信的一种方式

  • 是速度最快的,但是缺少同步机制,就是两个进程间不知道对方什么时候读,什么时候写。

-- 共享内存缺少同步机制指的是在多个进程或线程访问同一块内存区域时,这些进程或线程之间缺乏协调和控制,从而可能导致数据一致性问题或竞争条件。

  • 可以理解共享内存为一个系统级别的数组,可以当作数组进行操作

一、使用指令查看共享内存

  • ipcs -m 

    alt text

  • shmid:共享内存的 id

  • 字节:共享内存的大小

  • 连接数:有几个进程正在使用共享内存

二、使用共享内存进行通信的步骤

alt text

 

        -- 进程无法直接对共享内存进行操作。共享内存的工作原理是通过将物理内存区域映射到进程的虚拟地址空间来实现的。当多个进程需要访问共享内存时,它们首先需要执行映射操作,

1、获取键值

(1)函数获取:

-- 函数头文件

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

-- 函数原型

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

-- 函数的作用:

  • 通过传入的参数来获取指定的键值

-- 函数的参数:

  • pathname:必须是存在的路径
  • proj_id:0~255

-- 函数的返回值:

  • 会根据函数的参数来返回一个键值

(2)自己定义:

  • #define my_key 0x12345678

-- 键值的作用:

  • 一样的键值可以让不同进程来获取到同一个消息队列的id号

2、创建或获取共享内存 id

-- 函数头文件

  • #include <sys/ipc.h>
  • #include <sys/shm.h>

-- 函数原型

  • int shmget(key_t key, size_t size, int shmflg)

-- 函数的作用:

  • 创建或获取共享内存的 id

-- 函数的参数:

  • key:键值
  • size:共享内存的大小,单位为字节

但是实际大小单位按页(1页 = 4KB)来算,按页向上取整
假设为5字节,则实际大小为4KB。
也就是小于1页是按1页算,大于1页按页向上取整,如1.5页就是2页,2.5页就是3页

  • shmflg:权限
    -- 固定值 IPC_CREAT | 0666 -- IPC_CREAT:如果共享内存不存在则创建,如果共享内存存在则获取

-- 函数的返回值:

  • 成功返回共享内存的 id
  • 失败返回-1

alt text

3、映射共享内存到进程的地址空间

-- 函数头文件

  • #include <sys/ipc.h>
  • #include <sys/shm.h>

-- 函数原型

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

-- 函数的作用:

  • 将共享内存映射到进程的地址空间

-- 函数的参数:

  • shmid:共享内存的 id
  • shmaddr:映射的地址,一般传NULL,让系统自动分配
  • shmflg:权限

固定值 0

-- 函数的返回值:

  • 成功返回映射的地址
  • 失败返回-1

alt text

4、进行数据的写入和读取        

-- 如果传输的数据是字符串的格式的话,相当于对字符数组做操作,直接输入即可。

alt text

-- 如果传输的数据是结构体的话,需要使用memcpy函数

 -- memcpy

-- 我们映射成功之后,可以获取到共享内存的首地址,可以直接将他当作一个数组来操作
-- 当我们传输结构体时就不太方便,需要学习新的函数
-- “块”拷贝可以解决所有问题

  • 这个函数可以解决任何数据类型的数据传递问题

-- 函数头文件

  • #include <string.h>

-- 函数原型

  • void *memcpy(void *dest, const void *src, size_t n)

-- 函数的作用:

  • 将src指向的内存中的n个字节复制到dest指向的内存中(把一块内存的空间拷贝到另一个地址上去)

-- 函数的参数:

  • dest:目标地址
  • src:源地址
  • n:复制的字节数

-- 函数的返回值:

  • 返回目标地址(第一个参数的地址)

-- 使用该函数拷贝到共享内存中为数据的写入, 将数据从共享内存中拷贝出来为读取

alt text

5、对“块”进行赋值操作

-- 函数头文件

  • #include <string.h>

-- 函数原型

  • void *memset(void *s, int c, size_t n);

-- 函数的作用:对指定的内存块进行赋值操作

-- 函数的参数:

  • s:要赋值的内存块的首地址
  • c:要赋的值
  • n:要赋值的字节数

-- 函数的返回值:

  • 返回赋值后的内存块的首地址

-- 相当于给以p为首地址,总大小为4095字节的空间都赋值为0;

5、解除映射

-- 读取完数据后需要解除映射

-- 函数头文件

  • #include <sys/ipc.h>
  • #include <sys/shm.h>

-- 函数原型

  • int shmdt(const void *shmaddr)

-- 函数的作用:

  • 解除映射过来的共享内存

-- 函数的参数:

  • shmaddr:填写映射过来的共享内存地址

-- 函数的返回值:

  • 成功返回0
  • 失败返回-1

6、共享内存的多种操作函数

-- 函数头文件

  • #include <sys/ipc.h>
  • #include <sys/shm.h>

-- 函数原型

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

-- 函数的作用:

  • 对共享内存进行多种操作         例如:获取共享内存信息 删除共享内存等

-- 函数的参数:

  • shmid:共享内存的 id
  • cmd:要进行的具体操作

IPC_RMID 删除共享内存 第三参数为 NULL
IPC_STAT 获取共享内存信息
IPC_SET 设置共享内存信息

  • buf:传出和传入的共享内存信息

-- 函数的返回值:

  • 成功返回0
  • 失败返回-1

-- 一般用来删除共享内存

-- shmctl(id,IPC_RMID,NULL);

-- 删除共享内存的指令

  • ipcrm -m shmid

标签:共享内存,函数,映射,--,编程,系统,int,include
From: https://blog.csdn.net/m0_71813740/article/details/141608732

相关文章

  • 重头开始嵌入式第二十九天(Linux系统编程 网络通信 tcp)
    目录1.常见网络模型1.bs2.p2p3.cs2.网络编程之TCP(传输控制协议)1.TCP模型2.服务器端:1.socket();2、bind();3、listen();4、accept();5、接受函数:/发送函数:6、close()  ===>关闭指定的套接字id;3.客户端:1.connect();2、send()3、客户端信息获取4、客户端的信息bin......
  • java+vue计算机毕设物业信息管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和居民生活水平的提高,物业管理作为现代社区管理的重要组成部分,其复杂性和重要性日益凸显。传统的人工物业管理方式已难以满足当......
  • java+vue计算机毕设图书馆自习室管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及与知识经济的蓬勃发展,图书馆作为知识传播与学术交流的重要场所,其服务功能日益多元化与精细化。近年来,图书馆自习室因其安静的学习......
  • 基于springboot+vue.js的超市购物系统附带文章源码部署视频讲解等
    文章目录前言详细视频演示具体实现截图核心技术介绍后端框架SpringBoot前端框架Vue持久层框架MyBaits为什么选择我代码参考数据库参考测试用例参考源码获取前言......
  • 基于springboot+vue.js的短文写作竞赛管理系统附带文章源码部署视频讲解等
    文章目录前言详细视频演示具体实现截图核心技术介绍后端框架SpringBoot前端框架Vue持久层框架MyBaits为什么选择我代码参考数据库参考测试用例参考源码获取前言......
  • Java 入门指南:Java Socket 网络通信编程
    SocketSocket(套接字)是用于网络通信的编程接口、网络通信的基础,通过它可以实现不同计算机之间的数据传输,应用程序可以通过它发送或接收数据;就像操作文件那样可以打开、读写和关闭。它提供了一种机制,使得计算机之间可以进行数据的发送和接收。套接字允许应用程序将I/O应用......
  • 基于Springboot的档案管理系统
    文章目录项目介绍主要功能截图:部分代码展示设计总结项目获取方式......
  • 各种编程语言的优劣
    PythonPython是一种流行的高级编程语言,具有许多优点和一些缺点。以下是关于Python语言的优缺点及应用场景:优点:易学易用:Python语法简洁清晰,易于学习和使用,适合初学者入门。高效开发:Python的语法和标准库设计使得开发速度快,能够快速实现想法并快速迭代。广泛支......
  • 突破编程 C++ 设计模式(组合模式)详尽攻略
    在软件开发中,设计模式为程序员提供了解决特定问题的最佳实践。设计模式不仅提高了代码的可复用性和可维护性,还能帮助团队更好地进行协作。在这篇文章中,我们将深入探讨组合模式——一种结构型设计模式。组合模式允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合......
  • 《黑神话:悟空》游戏崩溃提示“找不到bpladll.dll文件”该怎么修复系统?黑神话悟空游戏
    在玩《黑神话:悟空》时,如果游戏崩溃并提示“找不到bpladll.dll文件”,这确实让人烦恼。要修复系统,可以先尝试在可靠的网站下载该文件,放置到正确目录。也可以检查系统的相关组件是否完整,或者对游戏进行重新安装。本篇将为大家带来《黑神话:悟空》游戏崩溃提示“找不到bpladll.dll文......