CREATEFILEMAPPINGについて教えてください。以下はサンプルのCのコードです。これはリードで開いています。別のプログラムでライトで同様に変数やファイル名で開くとお互いにデータの共有が可能です。ちなみにREAD_WRITEで最初に開いて、その後、以下のコードを含むEXEでREAD ONLYで開いた後、READ_WRITEのEXEを落としてももう一方でアクセス可能です。


このことから以下のコードを実行した後、上記説明の2つのEXEを落としてもWINDOWSはSHAREできるファイルを保持し続けているのでしょうか?

CREATEFILEMAPPING/MapViewOfFileの正しい動きを理解してないためお聞きしています。

よろしくお願いします。

hShare7 = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, FILE_MAP_READ,0, 1024, strShareName7);
shmem7 = (char*)::MapViewOfFile(hShare7, FILE_MAP_READ, 0, 0, 1024);

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/11/06 01:10:08
  • 終了:2009/11/08 13:15:38

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/11/06 02:18:35

ポイント35pt

(1)OS管理下に置かれる

CreateFileMapping 関数

INVALID_HANDLE_VALUE を指定した場合、呼び出し側プロセスは dwMaximumSizeHigh と dwMaximumSizeLow の各パラメータを使ってマッピングオブジェクトのサイズも指定しなければなりません。この場合、CreateFileMapping は指定されたサイズのファイルマッピングオブジェクトを作成しますが、ファイルシステム内の名前付きファイルではなく、オペレーティングシステムのページングファイルに関連付けます。


(2)OSに「消して」と頼まない限り居残り続ける

UnmapViewOfFile 関数

関連するファイルの最後のビューをアンマップするまでは、システムはそのファイルを引き続き開いておきます。


(3)OSシャットダウン時には、OSによって全てアンマップされ消え去る。


私自身、この程度までしか理解しておりませんが、参考になりますでしょうか?

その他の回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/11/06 02:18:35ここでベストアンサー

ポイント35pt

(1)OS管理下に置かれる

CreateFileMapping 関数

INVALID_HANDLE_VALUE を指定した場合、呼び出し側プロセスは dwMaximumSizeHigh と dwMaximumSizeLow の各パラメータを使ってマッピングオブジェクトのサイズも指定しなければなりません。この場合、CreateFileMapping は指定されたサイズのファイルマッピングオブジェクトを作成しますが、ファイルシステム内の名前付きファイルではなく、オペレーティングシステムのページングファイルに関連付けます。


(2)OSに「消して」と頼まない限り居残り続ける

UnmapViewOfFile 関数

関連するファイルの最後のビューをアンマップするまでは、システムはそのファイルを引き続き開いておきます。


(3)OSシャットダウン時には、OSによって全てアンマップされ消え去る。


私自身、この程度までしか理解しておりませんが、参考になりますでしょうか?

id:espresso3389 No.2

espresso3389回答回数35ベストアンサー獲得回数62009/11/06 02:30:58

ポイント35pt

第一引数(hFile)にINVALID_HANDLE_VALUEを指定されていますが、

MSDNのCreateFileMappingの説明によると、

hFile パラメータでINVALID_HANDLE_VALUEを指定した場合、呼び出し側プロセスは dwMaximumSizeHigh と dwMaximumSizeLow の各パラメータを使ってマッピングオブジェクトのサイズも指定しなければなりません。この場合、CreateFileMapping は指定されたサイズのファイルマッピングオブジェクトを作成しますが、ファイルシステム内の名前付きファイルではなく、オペレーティングシステムのページングファイルに関連付けます。複製、継承、名前の指定のいずれかより、ファイルマッピングオブジェクトを共有することもできます。

とあります。つまり、「オペレーティングシステムのページングファイル」の一部が利用されているという事みたいです。


一方で、基本的な話に戻れば、現代的なオペレーティングシステムにおいては、基本的に、仮想メモリという仕組みがあり、メモリとファイルは基本的には同じ仕組みであると考えた方が良いです。ファイルの読み込みとは、ファイルをメモリにマップ(無理に日本語にすると、反映)することであり、CreateFileMappingはそれを明示的にやっているに過ぎません。逆に、メモリが不足した場合には、メモリはファイルに書き出されて、物理メモリを消費しない状態になります(スワップアウトされる)。その後、そのメモリの情報が再度必要になれば、ファイルからメモリに情報が読み込まれる(マップされる)だけです。


従って、厳密なことを言えば、CreateFileMappingの第一引数がINVALID_HANDLE_VALUEの場合に、本当は、その情報が物理メモリ上に存在するのか、あるいは、ファイルとして存在しているのかは、空きメモリ状況などに依存します。うまくいけば、単純にメモリが複数プロセスで共有されているだけかもしれませんし、運が悪ければ、各プロセスがファイルを読み書きしているのと変わらないかもしれません。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません