拆分共享内存?

时间:2012-07-17 03:28:27

标签: c++ winapi

使用CreateFileMapping()分配共享内存块,并给出句柄。有些数据是使用MapViewOfFile()编写的 - 称之为“来源”

现在我希望将共享内存分成许多小块并获取它们的句柄 有没有办法做到这一点,而不是再次调用CreateFileMapping()并从'源'复制?

具有适当偏移的

OpenFileMapping()MapViewOfFile()可以正常工作但问题是,在这种情况下,调用OpenFileMapping()的进程可以访问其他进程在'source'中写入的数据并且它们可能因使用错误的偏移而损坏。

长话短说,我正在寻找像OpenFileMapping(String name, UINT **offset**, ...)

这样的东西

最后一句是误导。

我真正想做的是这样的事情:

<Host process>
HANDLE hShm = CreateFileMapping(INVALID_HANDLE_VALUE, ..., "shm");
void* pShm = MapViewOfFile(hShm);
UINT numShms = *(UINT*)pShm;   // first 4 bytes stores number of shared memory blocks
HANDLE *hShmSplit = new HANDLE[numShms];    
for(size_t i=0; i<numShms; i++) {
   TCHAR shmName[32];
   wsprintf(shmName, "shm%d", i);
   // suppose offset is set
   pShm+=offset;
   hShmSplit[i] = *CreateFileMappingFromExistingMapping*(pShm, shmName);
}
CloseHandle(hShm);   // no longer used

<Client process>
TCHAR* shmName="shm1";
HANDLE hShm = OpenFileMapping(shmName);
LPVOID p = MapViewOfFile(hShm);
// use shared memory 
// Now the client process has access to shm1 but not to shm2, shm3, or other shm_x's.

1 个答案:

答案 0 :(得分:0)

共享内存的工作原理是将同一物理内存页映射到多个进程的虚拟地址空间。一旦进程可以访问内存页面,它就可以访问整个页面。内存页面长度为4KB(尽管是Itanium)。

因此,如果您可以将映射文件拆分成碎片,则碎片必须从页面边界开始,并且大小为4KB的精确倍数。所以它不会那么有用。

如果您想要使用不同的客户端进程安全地共享不同的内存位,则必须为每个进程使用单独的映射。