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只是通信過程之間共享的一塊內存。 –
這是與平臺有關的 - 你在哪個平臺上? –