2012-01-12 5 views
3

저는 Memory Mapped Files에 익숙하지 않아 조금 잃어 버렸습니다.메모리 매핑 파일 - 파일이 아닌 구조를 매핑 하시겠습니까?

파일이 있으면 MMaps를 사용하여 파일을로드하고 다양한 프로세스에서 즉시 액세스 할 수 있다는 것을 알고 있습니다.

내 경우에는 프로세스 A에 연결된 DLL을 만들고 해당 DLL에 프로세스 A가 준비한 cSurface에 대한 포인터가 제공되었습니다. 그 C 서페이스의 데이터를 프로세스 B와 공유해야합니다. 빈 MMap을 호출하고 프로세스 A의 표면을 복사하여 프로세스 B에서 다시 복사해야합니다.

내 표면을 파일처럼 매핑 할 수 있으므로 MMap이 이미 표면 데이터를 가리킬 때 (내가 SomeTextFile.txt를로드했을 때와 같이)?

내 계획은 이론적으로 Proc A의 서페이스에 대한 포인터를 받고, 해당 표면의 메모리를 주어진 이름으로 공유하도록 지시하고, 뮤텍스를 사용하여 액세스를 조정하는 것입니다. 두 프로세스 모두 복사가 번거롭지 않은 동일한 물리적 사본.

그럴 수 있습니까?

+0

그냥 내 게시물을 좀 더 명확하게 만들 것이라고 생각했습니다. 'char buffer [SUPER_MASSIVE]'라고 불리는 거대한 버퍼와'hSuperMassiveFile'이라는 거대한 파일이 있다고 가정하십시오. 나는'CreateFileMapping (hSuperMassiveFile, ...)'을 실행하여 SuperMassiveFile을 공유 할 수 있었지만, 나의 버퍼와 똑같이하고 싶습니다. 대신'CreateFileMapping ((HANDLE) buffer, ...)'를 수행하고 빈 맵을 요청할 필요없이 내 버퍼를 공유 한 다음 내 버퍼를'CopyMemory()'할 필요가 있습니까? –

답변

1

귀하의 의견을 보내 주셔서 감사합니다.

저는 좀 더 조사를하고 대답을 찾았습니다.

당신은 파일이 파일, 또는 빈 메모리 공간 중 하나를 공유하는 매핑 된 메모리를 사용할 수 있습니다. 맵을 설정하기 전에 메모리에서 이미 초기화 된 데이터를 공유하려면 빈 맵을 작성한 다음 그 맵에 데이터를 복사해야합니다.

2

예, CreateFileMapping의 설명서에 모두 나와 있습니다.

메모리 매핑 된 파일의 이름을 지정할 수 있습니다. 다른 프로세스가 동일한 이름을 가진 mmap을 열면 동일한 메모리를 가리 킵니다. CreateFileMapping의 핸들은 INVALID_HANDLE_VALUE로 설정되어 순수하게 메모리에 유지됩니다. CreateFileMapping

+0

내가 알기 론, 내 문제는 내 데이터가 포함 된 MMap을 시작하는 것입니다. 내 데이터가 _file_에 있고'CreateFileMapping (hMyFile, ...); '을 수행하면지도에 자동으로 MyFile의 내용이 포함됩니다. 하지만 제 데이터는 기억에 남습니다. 'CreateFileMapping (INVALID_HANDLE_VALUE, ...); '을 수행하면 초기화되지 않은 황무지에 대한 포인터가 반환됩니다. 그런 다음 커다란 버퍼를 복사해야합니다. 시간이 걸립니다. 지도가 만들어지는 순간부터 내 버퍼를 가리 키도록 만드는 방법이 있다면 나는 그것을 선호합니다. –

+0

DLL을 만들고 있는데 버퍼는 부모 응용 프로그램에서 만듭니다. 부모는 함수의 매개 변수로서 버퍼에 대한 포인터와 그 크기를 나에게 준다. 그래서 볼 수있는 것부터, 내 옵션은 버퍼를 MMapped 영역에 복사하거나 버퍼가 이미있는 영역을 매핑하는 것입니다. –