2009-07-10 12 views
3

私のサービスは、情報のいくつかのビットを格納する必要がある(、最小で少なくとも20ビット程度を、私は容易にもっとを利用することができる)ようWindowsでshm_openをエミュレートするには?

  • 、それがあってもサービスの場合、サービスの再起動を横切っ持続クラッシュしたか、そうでなければ異常
  • それは、再起動
  • 後には保存されません終了した私は、レジストリまたはファイルにこの情報を保存している場合、それはないでしょう

を読んで、非常に少ないオーバーヘッドで更新することができます自動的に空になるシステムが再起動したときに表示されます。

さて、私は近代的なPOSIXシステム上であれば、私は、プロセスの再起動しても持続するではなく、システムが再起動し、共有メモリ・セグメントを作成することになる、shm_openを使用して、永続的なデータならば、私はそれをクリーンアップするためにshm_unlinkを使用することができます何とか壊れてしまった。

私はMSDN : Creating Named Shared Memoryを見つけ、私のサービスの中でそれを再実装しました。これは基本的にshm_open("/my_service", O_RDWR, O_CREAT)の代わりにCreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")を使用します。

しかし、特にこのページファイルを使用したマッピングの生涯を中心に、いくつかの懸念があります。私はMSDNのドキュメントでこれらの質問に対する答えを見つけられませんでした:

  • 再起動してもマッピングが維持されますか?
  • そうでない場合は、開いているハンドルをすべて閉じるとマッピングが消えますか?
  • そうでない場合は、マッピングを削除または消去する方法はありますか?それが使用中である必要はありません。

リブートしても保持されない場合や、参照されていない場合に消えたり、手動でリセットできない場合は、この方法は役に立たなくなります。

これらの点で不具合を確認したり見つけることができますか、あるいは別の方法をお勧めしますか?


再起動時に一掃されることが保証されたディレクトリがあった場合、私はそこに一時ファイルにデータを保存することができ、それはまだ理想的ではないでしょう:特定のシステム負荷の下で、我々はファイルに遭遇していますオープン/ライトの失敗(まれに、0.01%未満ですが、まだ発生しています)、この機能はロギング・パスで使用されます。私はこれ以上ファイル操作を導入しないことを望みます。

答えて

1

共有メモリマッピングは再起動しても保持されず、すべてのハンドルが閉じられると消えます。メモリマッピングオブジェクトはカーネルオブジェクトです.ClassHandleを介して明示的に、または参照を含むプロセスが終了したときに、最後の参照がなくなると常に削除されます。

REG_OPTION_VOLATILEでRegCreateKeyExのレジストリキーを作成してみてください。対応するハイブをアンロードしてもデータは保持されません。これは、HKLMのシステムシャットダウン時またはHKCUのユーザーログオフ時に行われます。

+0

私の現在のアプローチに欠陥があることを確認してくれてありがとう。私はその結論に来ていたが、まだテストに入れていた。 'HKLM'の' REG_OPTION_VOLATILE'は良いもののように見えますが、私はいくつかの社内レジストリラッパーを回避する必要があります。 – ephemient

-1

多分あなたは共有メモリの代わりにシリアル化をしたいのですか?これが実際にアプリケーションに適している場合、シリアライズする方法は使用言語によって異なります。 C++を使用しているなら、boost :: serializeをチェックしてください。C#には、あなたが使っているものであれば、間違いなく(javaのような)多くのシリアライゼーションオプションがあります。

+0

シリアライゼーションは問題ではありません。問題は、シリアル化されたデータの存続期間を正確に取得することです。 – ephemient

関連する問題