3

このサイトにリストされている 6 つのシグナルをオーバーロードしましたhttp://www.cplusplus.com/reference/clibrary/csignal/signal.html

次に、アプリを実行し(ダブルクリックではIDEを実行しませんでした)、1)タスクの終了、2)右上のX、3)プロセスの強制終了を試みました。最初の 2 つで何らかのシグナルが発生することを期待していましたが (私は XP を使用しています)、残念ながら何も得られませんでした。シグナルが発生したときに書き込むファイルを開くことはできませんか? 私はそう推測しています(SIGSEGVは私を許可しました)。

Firefox がクラッシュしたときや、Firefox を強制終了したときに、以前のページを記憶しています。ページをクリックするたびにアドレスをログに記録しますか、それともシグナル/クラッシュでログに記録しますか?

私の主な質問は、キルプロセスをキャッチするためにどのシグナルを使用できるかです

4

3 に答える 3

4

Win32 は、プログラムが強制終了されるのを傍受するオプションを提供しませんTerminateProcess(これは、タスク マネージャーから「タスクを終了」するか、[X] をクリックすると発生します)。

C ランタイム ライブラリは、Windows での実行時にこのシグナルのエミュレーションを提供するため、SIGSEGV シグナルをキャッチできます。プログラムが Windows アクセス違反 (例外 0xC0000005) を引き起こした場合、ランタイム ライブラリには、それをキャッチして Unix スタイルの SIGSEGV をシミュレートするオプションがあります。ただし、これはそのような例外を処理する最良の方法ではありません。Win32 プログラムを作成している場合、通常は Unix スタイルのサービスを使用するべきではありません。

于 2009-01-27T09:14:13.277 に答える
1

SetUnhandledExceptionFilter を呼び出す既定の例外ハンドラーをオーバーライドすると、アクセス違反などのランタイム エラーをキャッチできます (これは win32 関数であり、C ライブラリ エミュレーションに依存していません)。これは、プログラムがクラッシュしたときに「ミニダンプ」を提供するために使用できる方法です。

ただし、この例外ハンドラーは、アプリケーションを通常どおりに閉じたとき、またはアプリケーションをタスク マネージャーから閉じたときには呼び出されません。最後のケースでは、Windows が TerminateProcess を呼び出しており、クリーン シャットダウンではありませんが、プログラムを強制的に終了させて​​います。

Firefox で使用されている実装がどれであるかはわかりませんが、現在開いているタブを保存するにはタイマーが実行されている可能性が高く、実行されるたびに履歴がファイルと何らかのダーティ マークに保存されます。

プログラムが閉じられたことを検出するための他のより複雑なソリューション (ウイルス対策プログラムや同様のプログラムによって実装されます) は、2 つの無関係なプログラムを実行し、それぞれがもう一方がまだ実行中であることを確認し、一方が他方が閉じられたことを検出した場合は再度実行することです。

于 2009-01-27T14:31:22.000 に答える
0

Windows アプリは、コンソール アプリまたは GUI アプリのいずれかです。コンソール アプリは WM_CLOSE、コンソール アプリは CTRL_CLOSE_EVENT になる傾向があります。どちらも信号ではありません。アプリが TerminateProcess() によって終了された場合、どちらも送信されません。

自分がどこにいたかを保存したい場合は、メモリ マップト ファイルを使用し、すべてのアクションでそれを更新します。プロセスが終了すると、メモリ内のダーティ ページが OS によってファイルに書き戻されます。このソリューションにより、OS がディスク I/O を管理できるようになり、より適切な位置に置かれます。

于 2009-01-27T15:35:07.953 に答える