char* openSharedMemory(string name);
是否可以实现上述功能?给定名称,使用该名称打开共享内存段并将句柄返回到共享内存。如果不存在具有给定名称的共享内存,请创建一个并返回句柄。
答案 0 :(得分:2)
是的,如果您在最近的任何Unix上,请查看shm_overview(7)
,特别是shm_open(3)
。
答案 1 :(得分:2)
好吧,boost::interprocess支持这个..
答案 2 :(得分:1)
便携式地,您可以使用Boost.Interprocess。
在Posix上,您可以这样做:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
const size_t SHARED_MEMORY_SIZE = whatever;
char* openSharedMemory(std::string const &name)
{
int fd = shm_open(name.c_str(), O_RDWR, 0);
if (fd < 0) {
// failed to open existing file, try to create a new one
fd = shm_open(name.c_str(), O_RDWR | O_CREAT, 0666);
if (fd < 0 || ftruncate(fd, SHARED_MEMORY_SIZE) != 0) {
return NULL;
}
}
return static_cast<char*>(
mmap(NULL, SHARED_MEMORY_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0));
}
虽然你应该将它包装在一个类中,但要保留文件描述符,以便在销毁时取消映射并关闭共享内存对象。
答案 3 :(得分:0)
如果是Windows,请查看使用内存映射文件。
答案 4 :(得分:0)
在Windows上查看MemoryMappedFiles和名称为
的CreateFileMapping