メモリマップファイルを作成する

WindowsのようなOSでは、ページングやらメモリ保護やらたくさんの機能がある。おかげで異なるプロセス同士でも、お互い干渉せず実行できたりする。でも、複数のプロセスからメモリを共有したいときがある。メモリマップファイルというOSの機能を使えば、簡単にメモリを共有することが可能となる。

write.c (共有メモリに情報を書き出すプロセス)

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i =0;
  int *p = NULL;
  HANDLE h;
  h = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "a");
  p = MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 1024);

  for (i = 0; i < 128; i++) {
    p[i] = i * 10;
  }

  getchar();

  return 0;
}

read.c (共有メモリから情報を読み込むプロセス)

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i =0;
  HANDLE h;
  int *p = NULL;
  h = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "a");
  p = MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 1024);

  for (i = 0; i < 128; i++) {
    printf("p[%d]= %d\n", i, p[i]);
  }

  return 0;
}

この二つのサンプルのソースコードをそれぞれコンパイルし、実行してみる。write.exeが実行している間では、read.exeでは数字が読み込むことができる。ここで、二つの異なるプロセスがメモリを共有できていることが分かる。write.exeが実行し終わった後では、自動的にメモリ共有は終わり、read.exeは読み込む内容はすべて0クリアされてしまう。