명명된 공유 메모리 만들기

데이터를 공유하기 위해 여러 프로세스는 시스템 페이징 파일이 저장하는 메모리 매핑 파일을 사용할 수 있습니다.

첫 번째 프로세스

첫 번째 프로세스는 INVALID_HANDLE_VALUE 및 개체의 이름을 사용하여 CreateFileMapping 함수를 호출하여 파일 매핑 개체를 만듭니다. PAGE_READWRITE 플래그를 사용하여 프로세스는 생성된 모든 파일 뷰를 통해 메모리에 대한 읽기/쓰기 권한을 가집니다.

그런 다음, 프로세스는 CreateFileMappingMapViewOfFile 호출에서 반환하는 파일 매핑 개체 핸들을 사용하여 프로세스 주소 공간에서 파일 보기를 만듭니다. 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;
}

파일 및 메모리 공유