2012-07-17 2 views
0

공유 메모리 블록은 CreateFileMapping()을 사용하여 할당되며 그에 대한 핸들이 제공됩니다. 일부 데이터는 MapViewOfFile()을 사용하여 작성되었습니다. '소스'라고합니다.공유 메모리 분할 중입니까?

이제 공유 메모리를 많은 작은 블록으로 분할하고 핸들을 가져 오려합니다.
CreateFileMapping()을 다시 호출하지 않고 '원본'에서 복사하는 중에 수행 할 수있는 방법이 있습니까? 적절한 오프셋 (offset)를

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

... 왜 그 중간에 포인터를 전달할 수 없습니까? –

+0

그것은 다중 프로세스 프로젝트이므로 ... –

+0

열려있는 파일에 다른 프로세스가 어떻게 도달 할 것으로 예상합니까? –

답변

0

공유 메모리는 여러 프로세스의 가상 주소 공간에 동일한 물리적 메모리 페이지를 매핑하여 작동합니다 : 난 정말 할 노력하고있어 무엇

이 같은 것입니다. 프로세스가 메모리 페이지에 액세스하면 전체 페이지에 액세스 할 수 있습니다. 메모리 페이지의 길이는 4KB입니다 (Itanium과 관계없이).

매핑 된 파일을 조각으로 나눌 수 있다면 조각은 페이지 경계에서 시작하여 4KB의 배수가되어야합니다. 그래서 그렇게 유용하지는 않을 것입니다.

다른 클라이언트 프로세스와 다른 메모리 비트를 안전하게 공유하려면 각 클라이언트 프로세스마다 별도의 매핑을 사용해야합니다.