異なるプロセスでのCreateFileMapping

解決


やん  2012-04-26 10:11:54  No: 73354  IP: 192.*.*.*

VC2008
WindowsXP

異なるプロセスでCreateFileMappingを行うと取得したHANDLEの値が違います。
プロセス1でCreateFileMappingを行いプロセス2CreateFileMappingを行ったあとでGetLastError() == ERROR_ALREADY_EXISTSでチェックしたところ、Falseなので違うものを作成していることになるようです。
CreateFileMappingの最後の引数が同じ文字列であれば同様のマップドファイルが作成されると認識しているのですが、正しいでしょうか?
いろいろと勉強中です。
よろしくお願いします。

編集 削除
オショウ  2012-04-26 18:25:13  No: 73355  IP: 192.*.*.*

HANDLEが異なるのは、当たり前です。
同じ値が返ってくるようなことはありません。
同じファイルマッピングオブジェクトの名前を指定していて
ERRORしないのであれば、正しく同一の共有メモリにアクセス
可能です。

以上。

編集 削除
やん  2012-05-08 11:30:35  No: 73356  IP: 192.*.*.*

すいません、回答ありがとうございます。

CreateFileMappingにより作成されたマッピングファイルを自プロセスで使用するためにMapViewOfFileでpMap=MapViewOfFileとしてアドレスを取得しました。
このアドレスpMapはプロセス1とプロセス2で異なります。
プロセス1側でMemcopy(pMap,,)とし、プロセス2でpMapを読み込みました。
これは問題なく成功したのですが、プロセス1でpMap = "T";
としプロセス2でpMapを読み込むとこれはだめです。
というのはアドレスが異なるから?
すいません、初歩的な質問かもしれませんがアドバイスください。

よろしくお願いします。

編集 削除
YuO  2012-05-08 13:05:39  No: 73357  IP: 192.*.*.*

> これは問題なく成功したのですが、プロセス1でpMap = "T";
> としプロセス2でpMapを読み込むとこれはだめです。

char buf[16] = "S";
char *p1 = buf;
char *p2 = buf;
p1 = "T";
puts(p2);
上記のプログラムで"T"ではなく"S"と出力されるのと,理由は同じです。
ポインタ型の変数自体を書き換えても,ポインタが指していた先を書き換えません。

編集 削除
やん  2012-05-11 13:11:55  No: 73358  IP: 192.*.*.*

自分で検証して色々わかりました。勉強になります。

そもそもMapViewOfFileで取得したアドレスについてですが。
異なるプロセスでで同じマッピングオブジェクトの名前で作成したCreateFileMapping(以下pMap)は、同じアドレス値になりますか?

というのは
同じアドレスだと思っているのですが異なるプロセスを両方動作させたときにpMapのアドレス値が異なるからです。(ステップ実行により変数値確認)
そもそもこのアドレスが等しいから共有できるのでは??と思っているのですが、けんとうちがいでしょうか?

編集 削除
PATIO  2012-05-11 14:27:15  No: 73359  IP: 192.*.*.*

プロセス内のアドレス空間はプロセスが違えば別管理になるので
同じアドレスになるという意識は持たないほうがよいと思いますよ。
というか、そこをうまく繋ぐ為の方法としてメモリマップドファイルを使っているわけですし。

この辺の話はWindowsのメモリ管理に関して調べて勉強してみてください。

編集 削除
やん  2012-05-11 15:53:32  No: 73360  IP: 192.*.*.*

了解しました。
うやむやな部分が少し晴れました。
もっと勉強し、再度わからないことがあればまたお願いします。

編集 削除