0

使用分配的共享内存块CreateFileMapping()并给出它的句柄。一些数据是使用写入的MapViewOfFile()——称之为“源”

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

OpenFileMapping()并且MapViewOfFile()使用适当的偏移量将起作用,但问题是,在这种情况下,调用的进程OpenFileMapping()可以访问其他进程在“源”中写入的数据,并且它们可能会因使用错误的偏移量而损坏。

长话短说,我正在寻找类似的东西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.
4

1 回答 1

0

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

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

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

于 2012-07-17T13:37:46.960 回答