【linux编程】共享内存
共享内存
下面是一个简单明了的 C++ demo,演示使用 shm_open + mmap 创建共享内存并在 mmap 后立即调用 shm_unlink,从而实现“匿名共享内存”(仅当前进程使用,路径消失,但映射依然有效)。
#include <fcntl.h> // shm_open
#include <sys/mman.h> // mmap
#include <sys/stat.h> // mode constants
#include <unistd.h> // ftruncate, close
#include <string.h> // memset, memcpy
#include <iostream>
#include <cstdlib> // exit
#include <errno.h>
int main() {
const char *shm_name = "/my_test_shm";
const size_t size = 4096;
// 1. 创建共享内存对象
int fd = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0666);
if (fd < 0) {
perror("shm_open");
exit(1);
}
// 2. 设置共享内存大小
if (ftruncate(fd, size) < 0) {
perror("ftruncate");
exit(1);
}
// 3. mmap 映射
void *addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
exit(1);
}
std::cout << "mmap success, address = " << addr << std::endl;
// 4. 取消路径引用 —— 共享内存对象不再可见
if (shm_unlink(shm_name) < 0) {
perror("shm_unlink");
// 不退出,继续演示 mmap 是有效的
} else {
std::cout << "shm_unlink success: " << shm_name << std::endl;
}
// 5. 写入数据
const char *message = "Hello from shared memory!";
memcpy(addr, message, strlen(message) + 1);
std::cout << "Wrote message: " << message << std::endl;
// 6. 读取数据
std::cout << "Read message: " << static_cast<char*>(addr) << std::endl;
// 7. 清理
munmap(addr, size);
close(fd);
return 0;
}
编译运行:
g++ -std=c++11 shm_demo.cpp -o shm_demo
./shm_demo
mmap success, address = 0x7f2f201da000
shm_unlink success: /my_test_shm
Wrote message: Hello from shared memory!
Read message: Hello from shared memory!