2012-07-17 88 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大小的精確倍數。所以它不會有用。

如果要安全地與不同的客戶端進程共享不同的內存位,則必須爲每個進程使用單獨的映射。