メモリマップファイルを作成する
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クリアされてしまう。