2012-07-17 6 views
0

Un bloc de mémoire partagée est alloué en utilisant CreateFileMapping() et le handle correspondant est donné. Certaines données ont été écrites en utilisant MapViewOfFile() - appelez cela 'source'Fractionner la mémoire partagée?

Maintenant, je souhaite diviser la mémoire partagée en plusieurs petits blocs et d'obtenir les poignées pour eux.
Y at-il un moyen de faire cela sans appeler à nouveau CreateFileMapping() et de copier à partir de «source»?

OpenFileMapping() et MapViewOfFile() avec des décalages appropriés fonctionne, mais le problème est, dans ce cas, le processus qui appelle OpenFileMapping() arriver à avoir accès aux données écrites dans « source » par d'autres processus et ils peuvent être endommagées en utilisant un décalage erroné.

Longue histoire courte, je cherche quelque chose comme OpenFileMapping(String name, UINT **offset**, ...)


La dernière phrase était trompeuse.

Ce que je suis vraiment en train de faire est quelque chose comme ceci:

<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

... Pourquoi ne pouvez-vous pas simplement passer des pointeurs au milieu de celui-ci? –

+0

C'est un projet multi-processus donc ... –

+0

Comment vous attendez-vous à ce que les autres processus obtiennent le fichier ouvert alors? –

Répondre

0

Mémoire partagée fonctionne en cartographiant la même page de mémoire physique dans l'espace d'adressage virtuel de plusieurs processus. Une fois qu'un processus a accès à une page de mémoire, il a accès à la page entière. Les pages de mémoire ont une longueur de 4 Ko (Itanium nonobstant).

Par conséquent, si vous pouviez diviser un fichier mappé en morceaux, les pièces devraient commencer sur les limites de la page et être des multiples exacts de 4 Ko. Ce ne serait donc pas si utile.

Si vous souhaitez partager différents bits de mémoire en toute sécurité avec différents processus client, vous devez utiliser un mappage distinct pour chacun d'eux.