명명된 공유 메모리 만들기
데이터를 공유하기 위해 여러 프로세스는 시스템 페이징 파일이 저장하는 메모리 매핑 파일을 사용할 수 있습니다.
참고 항목
이 예제의 코드에는 런타임 시 관리 권한이 필요합니다.
첫 번째 프로세스
첫 번째 프로세스는 INVALID_HANDLE_VALUE 개체의 이름을 사용하여 CreateFileMapping 함수를 호출하여 파일 매핑 개체를 만듭니다. PAGE_READWRITE 플래그를 사용하여 프로세스는 생성된 모든 파일 뷰를 통해 메모리에 대한 읽기/쓰기 권한을 가집니다.
그런 다음, 프로세스는 CreateFileMapping이 MapViewOfFile에 대한 호출에서 반환하는 파일 매핑 개체 핸들을 사용하여 프로세스 주소 공간에서 파일 보기를 만듭니다. MapViewOfFile 함수는 파일 뷰pBuf
에 대한 포인터를 반환합니다. 그런 다음 이 프로세스는 CopyMemory 함수를 사용하여 다른 프로세스에서 액세스할 수 있는 문자열을 뷰에 씁니다.
파일 매핑 개체 이름을 "Global\"으로 접두사로 지정하면 프로세스가 서로 다른 터미널 서버 세션에 있더라도 서로 통신할 수 있습니다. 이렇게 하려면 첫 번째 프로세스에 SeCreateGlobalPrivilege 권한이 있어야 합니다.
프로세스에서 파일 매핑 개체에 더 이상 액세스할 필요가 없는 경우 CloseHandle 함수를 호출해야 합니다. 모든 핸들을 닫으면 시스템에서 개체가 사용하는 페이징 파일의 섹션을 해제할 수 있습니다.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process.");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
두 번째 프로세스
두 번째 프로세스는 첫 번째 프로세스에서 첫 번째 프로세스와 동일한 매핑 개체 이름을 지정하는 OpenFileMapping 함수를 호출하여 공유 메모리에 기록된 문자열에 액세스할 수 있습니다. 그런 다음 MapViewOfFile 함수를 사용하여 파일 뷰pBuf
에 대한 포인터를 가져올 수 있습니다. 프로세스는 다른 문자열과 마찬가지로 이 문자열을 표시할 수 있습니다. 이 예제에서 표시되는 메시지 상자에는 첫 번째 프로세스에서 작성한 "첫 번째 프로세스의 메시지" 메시지가 포함됩니다.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}