3

私のサービスは、数ビットの情報を保存する必要があります (最低でも 20 ビット程度ですが、それ以上を簡単に利用できます)。

  • サービスがクラッシュしたり、異常終了したりしても、サービスの再起動後も保持されます
  • 再起動後は持続しません
  • わずかなオーバーヘッドで読み取りと更新が可能

この情報をレジストリまたはファイルに保存すると、システムの再起動時に自動的に空になりません。

現在、最新の POSIX システムを使用している場合はshm_open、 を使用します。これにより、プロセスの再起動後も持続する共有メモリ セグメントが作成されますが、システムの再起動後は持続しませんshm_unlink。永続データが何らかの形で破損した場合は、それをクリーンアップするために使用できます。

MSDNを見つけました: 名前付き共有メモリの作成と、サービス内での再実装を開始しました。これは基本的CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")に の代わりに使用しshm_open("/my_service", O_RDWR, O_CREAT)ます。

ただし、特にこのページファイルに基づくマッピングの有効期間を中心に、いくつかの懸念があります。MSDN ドキュメントでこれらの質問に対する回答が見つかりませんでした。

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

再起動後も保持される場合、または参照されていないときに消える場合、または手動でリセットできない場合、この方法は役に立ちません。

これらの点で欠陥を検証または発見できますか、または別のアプローチを推奨できますか?


再起動時に消去されることが保証されているディレクトリがあれば、一時ファイルにデータを保存できますが、それでも理想的ではありません。特定のシステム負荷の下で、ファイルのオープン/書き込みエラーが発生します (まれに、時間の 0.01% 未満ですが、まだ発生しています)、この機能はログ パスで使用されます。ここではこれ以上ファイル操作を紹介したくありません。

4

2 に答える 2

1

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

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

于 2009-07-10T18:22:47.373 に答える