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

在C++中使用共享内存,主要是为了实现进程间高效的数据共享。共享内存允许多个进程访问同一块物理内存区域,避免了频繁的数据拷贝,适合对性能要求较高的场景。在Linux系统下,通常使用POSIX共享内存或System V共享内存接口。下面介绍基于POSIX的方式,因为它更现代、易用。
创建和映射共享内存
使用POSIX共享内存需要包含sys/mman.h、fcntl.h和unistd.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备份和恢复可以在几分钟内备份和恢复整个系统,使用点-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++中顺利使用共享内存。











