メモリマップドファイルが大量にクリエイトされるのを防ぐには?


むー  2009-11-13 23:36:42  No: 71096

お世話になっております。

メモリマップドファイルを用いて2つの独立で動作するアプリケーション間でプロセス間通信を行うプログラムを組んでいます。しかし,連続で数分以上走らせていると,途中で通信が途絶えてしまうバグを発見しました。

Process Exploererというフリーソフトを使って,CreateFileMapping時につけた名前を検索すると,その名前が複数検索され,その数は常に更新され増え続けます。

通信が途中で途絶えてしまう理由の原因は他にも有るかもしれませんが,今のところ,この現象が原因なのではないかと疑っています。

それぞれのアプリ機能を簡略化して説明いたします。

(1) Main関数内:

int main{

  Update():16ms毎に呼ばれる:MMTimerを使用
}

(2) Update()の内容:

・CreateMutexでミューテックスオブジェクト:TestMutexObjectをオープン
・WaitForSingleObjecを呼び出し,メッセージ処理

    case WAIT_OBJECT_0:
        FileRead();//Get data
        FileWrite();//Set data
        break;
    case WAIT_TIMEOUT:
      Sleep(100);
      break;
    case WAIT_ABANDONED:
      Sleep(100);
      break;
    default:
      printf(".");
      Sleep(100);
      break;

(3) FileRead()の内容:

・CreateFileMappingでメモリマップドファイル:TestFMObjectを作成  
・MapViewOfFile実行
・ファイル読み込み処理
・return

(4)FileWrite()の内容:

・CreateFileMappingでメモリマップドファイル:TestFMObjectを作成  
・MapViewOfFile実行
・ファイル書き込み処理
・FlushViewOfFileで強制書き込み
・UnmapViewOfFile実行  
・return

プロセス間通信開始後,Process Exploererで"TestFMObject"を検索すると,
検索毎にその数が増殖しているのが分かります。

TestFMObjectが増え続けると通信が途絶える事につながるのでしょうか。。

今回は,このTestFMObjectが増殖する原因と解決策を質問させてください。
以上、よろしくお願いいたします。

開発環境
・XP
・VisualC++6.0
・MFC


もしかして  2009-11-14 08:29:19  No: 71097

単純にCloseHandleしてないだけでは?

Process Exploererは知りませんが、
GetLastError()を表示させたときのエラーコードは
どうなっていますか?

また、タスクマネージャで見たときのハンドル数とか。


かりゆし  2009-12-02 02:01:51  No: 71098

>・CreateFileMappingでメモリマップドファイル:TestFMObjectを作成
どちらでも、作成をしているようですが、、
まずOpenFileMappingで、オープンできなければ作成にすると、複数作成されないですよ

「既に無いなら作成」当然ユニークな名前にしないとだめですが、、、

ぱっと見、常に作成になっているみたいです。


YuO  2009-12-02 03:04:53  No: 71099

おそらく,もしかしてさんの
> 単純にCloseHandleしてないだけでは?
が当たりでしょう。

試してみましたが,
CreateFileMapping(NULL, NULL, PAGE_READWRITE, 0, 0x1000, TEXT("Test"));
を二度実行すると,異なるハンドルが得られ,後者はGetLastErrorでERROR_ALREADY_EXISTSが得られます。

また,Process ExplorerのHandleでも,TypeがSectionである,同一名のハンドルがあることが確認されました。

> まずOpenFileMappingで、オープンできなければ作成にすると、複数作成されないですよ
CreateFileMappingの仕様上,既存の同名のマッピングオブジェクトがあればそれを開くので,OpenFileMappingを使う必要はありません。
MSDN: CreateFileMapping Function (Windows)
http://msdn.microsoft.com/en-us/library/aa366537.aspx

ただし,読み込むのであれば作る必要はないのですから,OpenFileMappingを使うというのはありだと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加