C++在Linux中如何使用共享内存
在Linux环境下,C++与共享内存的交互,其实主要就是两条路:POSIX共享内存API,以及System V那一套。今天咱们先拿POSIX讲个基础例子,手把手带大家走一遍流程。 首先,头文件得备齐。别嫌麻烦,这几个是标配: #include #include // 文件控制常量,比如O_CREAT
在Linux环境下,C++与共享内存的交互,其实主要就是两条路:POSIX共享内存API,以及System V那一套。今天咱们先拿POSIX讲个基础例子,手把手带大家走一遍流程。

首先,头文件得备齐。别嫌麻烦,这几个是标配:
#include
#include // 文件控制常量,比如O_CREAT
#include // mmap核心
#include // close
#include // memset、memcpy
接下来,创建共享内存对象。这里用shm_open,名字得是“/”开头,比如"/my_shm"。权限0666,读写都开,O_CREAT表示没有就新建。注意错误处理,别偷懒:
const char* shm_name = "/my_shm";
int shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0666);
if (shm_fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
光有对象不行,还得给它定个大小。这里用ftruncate设置1KB,也就是1024字节。如果失败,同样得处理:
size_t shm_size = 1024; // 1KB
if (ftruncate(shm_fd, shm_size) == -1) {
perror("ftruncate");
exit(EXIT_FAILURE);
}
然后,最关键的一步:把共享内存映射到进程的地址空间。用mmap,参数分别是:NULL让系统选地址,长度1024,读写权限,MAP_SHARED表示其他进程也能看到(这才是共享的关键),文件描述符,偏移0。返回值是MAP_FAILED就说明挂了:
void* ptr = mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
映射到手,就能往里面读写数据了。比如,我们写个字符串,“Hello, shared memory!”,注意加个空字符结尾:
std::string message = "Hello, shared memory!";
memcpy(ptr, message.c_str(), message.size() + 1);
// 读出来看看
std::cout << "Message from shared memory: " << static_cast(ptr) << std::endl;
用完之后,记得清理。先munmap解除映射,再close文件描述符。如果想彻底删除这个共享内存对象,可以调用shm_unlink,不过这不是必须的,看场景:
if (munmap(ptr, shm_size) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
if (close(shm_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
// 可选:删除共享内存对象
if (shm_unlink(shm_name) == -1) {
perror("shm_unlink");
exit(EXIT_FAILURE);
}
这个例子虽然简单,但已经把核心流程跑通了——创建、设置大小、映射、读写、清理。实际项目中,往往还需要考虑同步,比如用信号量或者互斥锁来防止竞态条件,否则多进程同时读写会乱套。另外,错误处理不能只写个exit,生产环境得做更细致的日志和恢复。
最后提一句,POSIX共享内存API是Linux原生支持,而System V那一套也广泛存在于各种UNIX-like系统上。如果代码需要跨平台,最好用Boost.Interprocess这类库来统一封装,省得在不同系统上改来改去。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















