2011-11-30 46 views
0
char* openSharedMemory(string name); 

是否可以实现上述功能?给定一个名称,用该名称打开共享内存段,并将句柄返回到共享内存。如果具有给定名称的共享内存不存在,请创建一个并返回句柄。是否可以按名称打开共享内存段?

+0

你是什么意思的*共享内存段*? –

+0

@BjörnPollex只是通信过程之间共享的一块内存。 –

+0

这是与平台有关的 - 你在哪个平台上? –

回答

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)); 
} 

尽管你应该在类包装它,保持文件描述符的保持,因此可以取消映射,并关闭销毁共享内存对象。

+0

我试着用g ++编译你的代码,只是为了得到“undefined reference to shm_open”错误:( –

+0

用'-lrt'连接。 –

0

如果是Windows,请使用内存映射文件查看。