質問

// WWW:

私はこのサイト HTTPに記載されている6つの信号をオーバーロードされます。 cplusplus.com/reference/clibrary/csignal/signal.htmlする

そして、私は私のアプリを実行(ダブルクリックIDEを駆け抜けていない)と1を試してみました)エンド・タスク2)X topright上および3)プロセスを強制終了。私は、信号(私はXPの午前)のいくつかの種類を引き起こすことが最初の二つを期待しかし、私は何も持っていない悲しいかな。私は、信号が発生したときに書き込むファイルを開くことが許可されていないだろうか?私は(SIGSEGVが私を許さ)午前推測しています。

私はそれを殺すとき、Firefoxがクラッシュしたりすると、

、それは私が何であったかのページを記憶しています。それは私がページをクリックするか、それが信号/クラッシュにそれを行うんアドレスたびを記録していますか?

私の主な質問は、私はキル・プロセスをキャッチするために使用することができますどのような信号である。

役に立ちましたか?

解決

Win32のは、(タスクマネージャから「タスクの終了」または[X]をクリックしたときに何が起こるかである)TerminateProcessで殺されます。

あなたのプログラムを傍受するためのオプションを提供していません Windows上で実行している場合Cランタイムライブラリは、この信号のエミュレーションを提供するため、

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

他のヒント

デフォルトの例外ハンドラを呼び出すSetUnhandledExceptionFilterをオーバーライドする場合は、

あなたは(これはWin32関数であり、そのようなは、Cライブラリのエミュレーションに依存しないよう)、アクセス違反などのランタイムエラーをキャッチすることができます。このメソッドは、「ミニダンプ」を提供するために使用することができているときに、プログラムがクラッシュします。

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

私はこれを認識していないよは、Firefoxで使用される実装ですが、オープンは、タイマーが実行されている可能性がある現在のタブを節約するために、それはそれを実行するたびに、ファイルへの歴史や汚れのいくつかの種類を保存しますマークます。

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

Windowsアプリケーションは、コンソールアプリケーションまたはGUIアプリケーションのどちらかです。コンソールアプリケーションは、コンソールがCTRL_CLOSE_EVENTをアプリ、WM_CLOSEを取得する傾向があります。どちらの信号ではありません。どちらのTerminateProcessを経由してアプリケーションが終了した場合に送信されないであろう()。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top