首页 > 系统相关 >POSIX 共享内存

POSIX 共享内存

时间:2024-11-02 17:57:26浏览次数:3  
标签:映射 对象 POSIX 共享内存 open shm

POSIX 共享内存

与共享文件映射的区别

POSIX 共享内存能够让无关进程共享一个映射区域而无需创建一个相应的映射文件

  • POSIX共享内存主要用于 进程间通信
  • 共享文件映射主要用于 磁盘文件IO

创建共享内存对象

int shm_open(const char *name, int oflag, mode_t mode);

shm_open()函数创建和打开一个新的共享内存对象或打开一个既有对象

1

open()调用类似

共享内存对象的使用

  • 使用 shm_open() 函数创建或打开一个共享内存对象(与文件描述符的使用类似)

  • 一个新共享内存对象被创建时其初始长度会被设置为0。这意味着在创建完一个新共享内存对象之后通常在调用 mmap() 之前需要调用 ftruncate() 来设置对象的大小

  • 将文件描述符传入 mmap() 并在其flags参数中指 MAP_SHARED。这会 将共享内存对象映射进进程的虚拟地址空间

  • 一旦映射了对象之后就能够关闭该文件描述符而不会影响到这个映射(关闭后会影响后续的操作)

  • 使用 ftruncate() 来根据需求 扩大或收缩 共享内存对象(扩大时,新增的字节初始化为0

// 使用的框架

int fd = shm_open(name, oflgs, mode);   // 名字必须斜线开头,/demo_shm

ftruncate(fd, len);   // 扩展共享内存对象的大小,为mmap做准备

void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHAERD, fd, 0);   // 进程间的通信,可以通过对这块共享内存映射的读写实现

close(fd);   // 关闭文件描述符,后续可以用 addr 操作

// 待进程间通信结束后,删除共享内存对象,删除共享文件映射

删除共享内存对象

POSIX共享内存对象至少具备内核持久性,即它们会持续存在直到被显式删除或系统重启。当不再需要一个共享内存对象时就应该使用shm_unlink()删除它

int shm_unlink(const char *name);

标签:映射,对象,POSIX,共享内存,open,shm
From: https://www.cnblogs.com/dylaris/p/18522257

相关文章

  • 有管理共享内存设计方法的具体实现
    有管理的共享内存设计方法的具体实现涉及多个方面,包括内存分配与回收、访问控制、同步机制以及性能优化等。以下是对这些方面的详细介绍: 一、内存分配与回收内存池管理:创建一个内存池,用于管理共享内存的分配和回收。内存池可以基于固定大小的内存块进行分配,以减少内存碎片。......
  • 多核异构模式下有管理的共享内存设计方法
    随着嵌入式系统、高性能计算和物联网技术的飞速发展,多核异构处理器已经成为当前计算平台的重要组成部分。多核异构处理器通过集成多种类型的处理器核心(如高性能CPU核心、GPU核心、NPU核心等),能够同时满足高性能计算和节能降耗的需求。然而,多核异构处理器的设计也带来了新的挑战,尤其......
  • Linux系统System V机制共享内存基础用法C++代码示例
    写数据进程代码//writer.cpp#include<iostream>#include<sys/ipc.h>#include<sys/shm.h>#include<cstring>#include<unistd.h>intmain(){//使用ftok()生成一个唯一的键用来标识共享内存,shmfile需要是一个存在的文件,也可以用其他方法来生成用来标识共......
  • 【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)
    ......
  • 操作系统(7) (POSIX--Linux线程编程---使用多线程计算平方pthread_t/create/join应用)
    1.代码目的我们希望创建一个程序:启动多个线程,每个线程计算一个数字的平方值。每个线程将计算结果返回给主线程。主线程接收每个线程的返回值,并将结果打印出来。在这个例子中,我们通过传递不同的参数给每个线程,来让每个线程计算不同数字的平方值。2.代码实现以下是代码的......
  • windows DLL技术-DLL使用共享内存
    仅当加载DLL时,共享DLL内存才会保留。应用程序可以使用SetSharedMem和GetSharedMem函数访问共享内存。以下示例演示DLL入口点函数如何使用文件映射对象来设置可由加载DLL的进程共享的内存。实现共享内存的DLL该示例使用文件映射将命名共享内存块映射到加载DLL......
  • C系统编程通信方式——共享内存
        共享内存,标准IPC之一,也是进程间通信最快的一种方式。1.概念    所有的标准IPC都有一个内部ID作为唯一标识。内部ID的获取通过外部key,key的类型是key_t。key的获取方法有在头文件中定义所有key和通过ftok函数获取一个key。key_tftok(constchar*pathna......
  • C++使用共享内存实现进程间通信
    C++使用共享内存实现进程间通信文件映射是一种实现进程间单向或双向通信的机制。它允许两个或多个本地进程间相互通信。为了共享文件或内存,所有的进程必须使用相同的文件映射的名字或是句柄。为了实现共享文件,第一个进程先调用CreateFile方法。接下来调用CreateFileMappin......
  • Linux多进程通信--管道、消息队列、共享内存
    转载至https://www.cnblogs.com/LUO77/p/5816326.html多进程:首先,先来讲一下fork之后,发生了什么事情。由fork创建的新进程被称为子进程(childprocess)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程id。将子进程id返......
  • 最新下载 mingw 8.1.0-release-posix-seh 方式
    #最近运行一个GO项目进行build的时候,提示错误#cgo:Ccompiler"gcc"notfound:exec:"gcc":executablefilenotfoundin%PATH%#在网上看了一堆博客,说是在windows下无GCC编译器导致,需要下载MinGW-w64#于是就按照这些博客提供的链接去下载#https://source......