2012-07-17 116 views
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. 
+2

...为什么你不能只传递指向中间的指针? – 2012-07-17 03:29:56

+0

这是一个多进程项目,所以... – 2012-07-17 03:36:29

+0

您如何期待其他进程获得打开的文件呢? – 2012-07-17 03:44:30

回答

0

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

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

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