char* openSharedMemory(string name);
是否可以实现上述功能?给定一个名称,用该名称打开共享内存段,并将句柄返回到共享内存。如果具有给定名称的共享内存不存在,请创建一个并返回句柄。是否可以按名称打开共享内存段?
char* openSharedMemory(string name);
是否可以实现上述功能?给定一个名称,用该名称打开共享内存段,并将句柄返回到共享内存。如果具有给定名称的共享内存不存在,请创建一个并返回句柄。是否可以按名称打开共享内存段?
可移植的,你可以使用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));
}
尽管你应该在类包装它,保持文件描述符的保持,因此可以取消映射,并关闭销毁共享内存对象。
我试着用g ++编译你的代码,只是为了得到“undefined reference to shm_open”错误:( –
用'-lrt'连接。 –
是的,看看shm_overview(7)
如果你是最近的Unix,特别是shm_open(3)
。
如果是Windows,请使用内存映射文件查看。
在窗口看MemoryMappedFiles和使用一个名称
那么的CreateFileMapping,boost::interprocess支持这个..
你是什么意思的*共享内存段*? –
@BjörnPollex只是通信过程之间共享的一块内存。 –
这是与平台有关的 - 你在哪个平台上? –