2011-11-30 67 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,請使用內存映射文件查看。