명명된 공유 메모리 만들기
데이터를 공유하기 위해 여러 프로세스는 시스템 페이징 파일이 저장하는 메모리 매핑 파일을 사용할 수 있습니다.
첫 번째 프로세스
첫 번째 프로세스는 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;
}
관련 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기