クラッシュしたプロセスをWindowsでリロードする方法は?もちろん、カスタム監視Winサービスプロセスを実行できます。しかし、たとえばFirefox:そのようなものはインストールされていないようですが、それでもクラッシュしたときに自動的に再起動できます。
4 に答える
Vista以降では、RegisterApplicationRestart APIを使用して、クラッシュまたはハングしたときに自動的に再起動できます。
Vistaより前では、再起動を行うトップレベルの例外フィルターが必要ですが、侵害されたプロセス内でコードを実行することは完全に安全または信頼できるわけではないことに注意してください。
Firefoxは、タブを開いたり、リンクをクリックしたり、その他のアクションを実行したりするたびに、常にその状態をハードディスクに保存します。また、安全にシャットダウンしたことを示すフラグも保存されます。
起動時に、これをすべて読み戻し、その情報に基づいて「復元」することができます。
構造化例外処理 (SEH)を使用すると、プログラムのクラッシュをキャッチし、それが発生したときに何かを実行できます。
参照: __try および __except
SEH は非常に危険な場合があり、代わりにプログラムがハングする可能性があります。詳細については、この記事を参照してください。プログラムを NT サービスとして作成する場合、最初、2 番目、およびそれ以降の失敗時のアクションを「サービスの再起動」に設定できます。
Windows 2008 サーバーと Windows Vista および Windows 7 では、Win32 API RegisterApplicationRestartを使用できます。
さまざまな種類のプログラム クラッシュへの対処の詳細については、こちらの回答を参照してください。
私の記憶が正しければ、Windows は POSIX の少なくとも一部のサブセットを実装しているため、シグナル インターフェイス (SIGKILL、SIGSEGV、SIGQUIT など) が「必要」です。
Linux 以外でこれを行ったことはありませんが、signal() (signal.h) を使用して予期しない終了トラップを設定してみてください。ドキュメントのクイックスキャンから、シグナルの処理中に実行できることはほとんどないようです。新しいプロセスを開始することさえ禁止リストに載っている可能性があります。
考えてみると、おそらくマスター/ワーカー パターン、ワーカーを生成するだけの非常に単純な親スレッド (すべての UI やその他の処理を行う) を使用することになるでしょう。特定の「I'm going die now」ビットが設定されていないが、それでも停止する場合 (親プロセスは、生成されたプロセスが停止したというメッセージ/通知を常に受け取ります)、マスターはワーカーを再生成します。主なテーマは、マスターを非常にシンプルに保ち、独自のバグのために死ぬのが難しいことです.