前提・実現したいこと
windowsでファイルマッピングを実装しました。
発生している問題・エラーメッセージ
ファイルマッピング自体はうまくいきました。
ですが、ファイルマッピングオブジェクトのポインタを表示させたとき、
私の予想では異なるプロセスでも同じメモリ位置を指すはずが、違うメモ
リを指すという現象が発生しました。
(具体的には、プロセス1では0x000000D0を指し、プロセス2では0x000000CC
を指している)
何度か試してみましたが、5回に1回くらいの割合でなります。
私はプロセスから見た相対アドレスなのではないかと考えていますが、根
拠も何もありません。
なぜこのような現象が起こってしまうのかご存じの方がいらっしゃいましたら、よろしくお願いいたします。
該当のソースコード
C
1/********************** process1 **************************/ 2int main(void) 3{ 4 HANDLE file_mapping; 5 LPVOID file_view; 6 SYSTEM_INFO sys; 7 8 //ファイルマッピングオブジェクトへのポインタの取得 9 file_mapping = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 1, 0, TEXT("mapping")); 10 11 GetSystemInfo(&sys); 12 //ファイルビューへのポインタの取得 13 file_view = MapViewOfFile(file_mapping, FILE_MAP_ALL_ACCESS, 0, sys.dwAllocationGranularity, 5); 14 15 for(int i = 0; i < 5; i++){ 16 FillMemory(file_view+i, 1, (BYTE)'A'+i); //書き出し 17 } 18 19 while(1){ 20 printf("mapping %p\n", file_mapping); 21 Sleep(1000); 22 } 23 24 UnmapViewOfFile(file_view); 25 CloseHandle(file_mapping); 26 27 return 0; 28}
c
1/******************************** process2 ***************************/ 2int main(void) 3{ 4 HANDLE file_mapping; 5 char *file_view; 6 SYSTEM_INFO sys; 7 8 //ファイルマッピングオブジェクトのポインタの取得 9 file_mapping = OpenFileMappingW(FILE_MAP_READ, FALSE, TEXT("mapping")); 10 11 GetSystemInfo(&sys); 12 //ファイルビューのポインタの取得 13 file_view = (char *)MapViewOfFile(file_mapping, FILE_MAP_READ, 0, sys.dwAllocationGranularity, 5); 14 15 printf("mapping %p\n", file_mapping); 16 17 //書き込まれた文字の取得 18 for(int i = 0; i < 5; i++){ 19 printf("%d ", i); 20 printf("%c\n", *(file_view+i)); 21 } 22 23 return 0; 24}
試したこと
例外処理は省略しています。
プロセス1でファイルマッピングオブジェクトを直接メモリに作成し、そこに文字を書き込んでいます。
そして、プロセス2で書き込まれた文字を読み込んでいます。
先ほど記述した通り、プロセス2からの文字の読み込みは成功していますが、ポインタは違う値を
指しています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/22 13:04
2020/08/22 13:12 編集
2020/08/22 13:16
2020/08/22 13:20
2020/08/22 13:20
2020/08/22 13:21
2020/08/22 13:21