首页 > 系统相关 >Linux中的共享内存

Linux中的共享内存

时间:2024-07-06 13:27:59浏览次数:20  
标签:SHM 映射 shm Linux 进程 共享内存 ptr

我们承担ROS,FastDDS等中间件以及C++,cmake等技术的项目开发和专业指导和培训,有10年+工作经验,质量有保证,如有需要请私信联系。

Linux共享内存是一种进程间通信的方式,让不同的进程可以访问同一块内存区域。这样,一个进程可以直接读取或者修改另一进程的数据,避免了数据的复制,提高了通信效率。
Linux中的共享内存被组织成一种名为“段”(segment)的数据结构,每个段都有一个全系统唯一的键值。进程可以通过这个键值来获取相应的内存段。

Linux支持两种类型的共享内存:System V IPC共享内存和POSIX共享内存
共享内存涉及到的主要操作有创建和连接共享内存、读写共享内存和断开和删除共享内存。

另外,由于共享内存涉及到多个进程对同一块内存区域的访问,因此,在对共享内存进行读写时需要注意同步和互斥的问题,防止数据被同时修改,导致数据混乱。

System V IPC共享内存

这是早期UNIX系统引入的传统共享内存方式,通过ipc函数(如shmget, shmat等)进行操作。

POSIX共享内存

POSIX共享内存:相比于System V IPC共享内存,POSIX共享内存的接口更简单,而且性能也更好。其共享内存的创建和管理则更像是文件操作,通过mmap等函数进行操作,而且支持有名字的共享内存,这样就可以通过名字来让不相关的进程共享内存。

POSIX共享内存在Linux系统中,是通过内存映射的方式实现的。具体来说,它会在虚拟内存空间中创建一块区域,并将其映射到物理内存,这样就形成了一个共享内存区域。然后,不同的进程可以将这块共享内存区域映射到自己的地址空间中,这样就可以访问和修改这块共享内存。

创建和使用POSIX共享内存的步骤如下:

创建共享内存:可以使用shm_open函数创建一个新的共享内存段或者打开一个已存在的共享内存段。这个函数会返回一个文件描述符,后续的操作都会用到这个文件描述符。

设置共享内存大小:可以使用ftruncate函数设置共享内存的大小。需要注意的是,刚创建的共享内存大小为0,必须通过ftruncate设定大小后才能使用。

映射共享内存:可以使用mmap函数将共享内存映射到进程的地址空间,返回映射地址。之后进程就可以通过这个地址来访问共享内存。

操作共享内存:进程可以直接通过前一步得到的地址来读写共享内存。

解除映射:当进程不再需要使用共享内存时,应使用munmap函数将共享内存从自己的地址空间中解除映射。

删除共享内存:如果系统中不再需要这块共享内存,可以使用shm_unlink函数删除它。

因此,POSIX共享内存的关键在于内存映射,通过在虚拟内存和物理内存之间建立映射关系,使得不同的进程都可以访问同一块物理内存。这样不仅提高了数据访问的效率,而且简化了进程间的通信。

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define SHM_NAME "/my_shm"
#define SHM_SIZE 1024

int main() {
    int shm_fd;
    void *ptr;

    /* 创建共享内存对象 */
    shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
    if (shm_fd == -1) {
        perror("shm_open");
        exit(-1);
    }

    /* 设置共享内存的大小 */
    if (ftruncate(shm_fd, SHM_SIZE) == -1) {
        perror("ftruncate");
        exit(-1);
    }

    /* 映射共享内存 */
    ptr = mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(-1);
    }

    /* 在父进程中写入数据,子进程中读取数据 */
    if (fork() == 0) {
        /* Child process */
        sleep(1); /* Wait for a while to make sure the parent process has written the data. */
        printf("Child read: %s\n", (char*)ptr);
        munmap(ptr, SHM_SIZE);
        shm_unlink(SHM_NAME);
    } else {
        /* Parent process */
        const char *message = "Hello, Shared Memory!";
        sprintf(ptr, "%s", message);
        printf("Parent wrote: %s\n", (char*)ptr);
        sleep(2); /* Wait for a while to make sure the child process has read the data. */
        munmap(ptr, SHM_SIZE);
    }

    return 0;
}

标签:SHM,映射,shm,Linux,进程,共享内存,ptr
From: https://blog.csdn.net/qq_44624290/article/details/140227921

相关文章

  • Linux Samba 部署
            Samba是Linux下用于文件、打印机共享的开源软件套件,基于smb协议实现了Linux、Windows之间的打印机、文件共享,这里主要介绍常用的文件共享配置。     1、配置好yum源,安装好samb服务器、客户端软件包:    yuminstallsamba    yu......
  • 【Linux】:程序地址空间
    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!C语言专栏:C语言:从入门到精通数据结构专栏:数据结构个 人 主 页 :stackY、C++专栏  :C++Linux专 栏 ......
  • pwn的linux基础(计算机内部数据结构存储形式)
    linux基础保护层级:分为四个ring0-ring3一般来说就两个,0和30为内核3为用户 权限:用户分为多个组文件和目录等等的权限一般都是三个,即可读可写可执行。读:R,写:W,执行:X赋予一个可执行文件执行权限就是chmod+xfilename虚拟内存和物理内存:物理内存很直白,就是内存......
  • Linux关于数据库,群集,缓存加速等精捡面试题
    目录第一部分:企业网站架构部署与优化..................................................61.列举几种常见的HTTP状态码?及各种代表的含义?................................62.HTTP请求方法有哪些?请至少列举三种,并简述它们的用途。........................63.HTTP协......
  • Linux 干货:新手村全攻略,老手也不容错过
    以下是一篇详细的关于Linux系统的文章,涵盖了基础概念、常用命令、系统管理、网络配置、安全措施等多个方面,旨在提供全面的Linux知识。希望这些干货能对你有所帮助。掌握Linux:从基础到进阶Linux是一种开源的操作系统,广泛应用于服务器、开发环境、嵌入式系统等多种场景。了解......
  • Linux系统apt命令基础使用方法
    目录一.前言二.什么是apt命令三.apt命令基础用法四.修改apt软件包源一.前言apt命令相当强大,这篇文章只是介绍一些基础用法。二.什么是apt命令apt是一个软件包管理工具,主要是在Ubuntu和Debian系统中使用,可以用来对软件进行安装等操作,需要超级管理员(root)权限进行操作......
  • linux下mysql安装、授权、创建用户、连接navicat、连接entity
    1.linux下安装mysql:sudoapt-getupdatesudoapt-getinstallmysql-serversudosystemctlstartmysqlsudomysql_secure_installation#这一步不是必须的,甚至有害的2.授权usemysql;updateusersethost='%'whereuser='root';flushprivileges;grantall......
  • 初学者指南:如何选择嵌入式Linux和单片机(MCU)
    前言在嵌入式系统开发领域,选择合适的平台是项目成功的关键之一。对于初学者来说,如何在嵌入式Linux和单片机(MCU)之间做出选择可能是一项艰巨的任务。本文将详细解释这两种平台的特点、优缺点,以及在不同应用场景中的适用性,帮助初学者做出明智的选择。嵌入式Linux简介概述嵌入......
  • Linux系统的基础知识和常用命令
    1、什么是Linux?是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。......
  • Linux学习前置,红帽Linux系统安装
    前置:下载:VMwareWorkstationPro17,以及所需要使用的Linux版本;  安装VMwareWorkstation;安装:进入VMware后选择新建虚拟机: 选择Linux和redhat9版本; 选择使用网络地址转换 接下来选择推荐的设置就好;选择新建磁盘 虚拟机创建好后在设备一栏里单击CD/DVD(SATA)......