0

0

c++怎么使用共享内存_c++共享内存使用方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-09-30 11:45:02

|

425人浏览过

|

来源于php中文网

原创

答案:C++中通过POSIX共享内存实现高效进程间通信,使用shm_open创建、mmap映射、munmap解除并shm_unlink删除,需配合同步机制避免竞态。

c++怎么使用共享内存_c++共享内存使用方法

在C++中使用共享内存,主要是为了实现进程间高效的数据共享。共享内存允许多个进程访问同一块物理内存区域,避免了频繁的数据拷贝,适合对性能要求较高的场景。在Linux系统下,通常使用POSIX共享内存或System V共享内存接口。下面介绍基于POSIX的方式,因为它更现代、易用。

创建和映射共享内存

使用POSIX共享内存需要包含sys/mman.hfcntl.hunistd.h等头文件。

步骤如下:

  • 使用shm_open()创建或打开一个共享内存对象,返回文件描述符。
  • 使用ftruncate()设置共享内存的大小。
  • 使用mmap()将共享内存映射到当前进程的地址空间。

示例代码(创建并写入):

立即学习C++免费学习笔记(深入)”;

#include 
#include 
#include 
#include 
#include 

int main() { const char* name = "/my_shared_memory"; const size_t size = 4096;

// 创建共享内存对象
int fd = shm_open(name, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
    perror("shm_open");
    return 1;
}

// 设置大小
if (ftruncate(fd, size) == -1) {
    perror("ftruncate");
    return 1;
}

// 映射内存
void* ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
    perror("mmap");
    return 1;
}

// 写入数据
const char* msg = "Hello from process!";
std::strcpy((char*)ptr, msg);

std::cout << "Data written to shared memory.\n";

// 解除映射
munmap(ptr, size);
close(fd);
return 0;

}

访问已存在的共享内存

另一个进程可以以只读或读写方式打开同一个共享内存对象,进行数据读取或修改。

Redo Rescue: Backup and Recovery
Redo Rescue: Backup and Recovery

Redo Rescue备份和恢复可以在几分钟内备份和恢复整个系统,使用点-and-click界面,任何人都可以使用。裸机恢复到一个新的、空白的驱动器上,几分钟内即可启动和运行。支持保存和恢复到本地磁盘或共享网络驱动器。选择性地恢复分区并将其重新映射到目标驱动器上的不同位置。附带其他工具用于分区编辑、网页浏览等。从live CD/USB运行,无需安装。网站:http://redorescue.com论坛:https://sourceforge.net/p/redobackup/discussion/GitH

下载

示例代码(读取数据):

#include 
#include 
#include 
#include 

int main() { const char* name = "/my_shared_memory"; const size_t size = 4096;

// 打开已存在的共享内存
int fd = shm_open(name, O_RDONLY, 0);
if (fd == -1) {
    perror("shm_open read");
    return 1;
}

// 映射内存
void* ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
    perror("mmap read");
    return 1;
}

// 读取并输出
std::cout << "Read from shared memory: " << (char*)ptr << "\n";

// 清理
munmap(ptr, size);
close(fd);
return 0;

}

清理共享内存

使用完毕后,应解除映射并删除共享内存对象,防止资源泄漏。

  • 调用munmap()解除映射。
  • 调用shm_unlink()删除共享内存名称,当所有进程都关闭后,系统会自动释放资源。

清理示例:

// 在写入进程结束前或单独脚本中调用
shm_unlink("/my_shared_memory");

注意:共享内存不提供同步机制,若多个进程同时读写,需配合使用信号量或互斥锁来避免竞态条件。

基本上就这些。只要按步骤创建、映射、读写和清理,就能在C++中顺利使用共享内存。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1072

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

148

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1023

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1373

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

705

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

295

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

778

2023.07.05

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号