2011-08-07 6 views
5

何らかの種類の終了(異常、正常、キャッチされていない例外など)に関係なく、終了時にコードを実行する方法はありますか? 私はJavaで実際には可能ですが、C++でも可能ですか?私はWindows環境を想定しています。通常のクロージングapplciationについてはシャットダウンフックC++

+2

これは、いずれかのJavaでは不可能です - 言語に関係なく、すべてのプロセスは、[私は行くだろう、Linux上で信号-9をキャッチ(およびWindows上相当)またはその信号が – Soren

+0

を到着したときに@Drakeが示唆したように任意のコードを実行することはできませんatexit](http://www.cplusplus.com/reference/cstdlib/atexit/)。 –

答えて

5

んを示唆していないだろう - に任意のより多くのコードを実行するための任意のチャンスなしで誰かがTerminateProcessを呼び出した場合、あなたのプロセスは、さらに別れずに破壊され、(特に)シャットダウンのプロセス。問題にアプローチする

+1

これは正しい答えです。しかし ')あなたは'のatexitを() 'セットアップ出口ハンドラを使用することができますし、('信号を使用して、ほとんどの信号をキャッチすることができ、他の回答の一部によって示されるように - 誰かが強制終了した場合、あなたは(それをどんな行動を取ることはできませんしかし、私は出口が「正常であることを前提としている上のassert()、、)(中止)( – Soren

+0

ありがとう)Linux上で-9を殺し、そして信号9がキャッチできていることでしょう、実際に私もそのanswere – Paranaix

+0

のを恐れていました"すなわち、例えば経由しない'exit()'コール、またはセグメンテーション違反などによるものです。 –

1

一つの良い方法は、ACEライブラリ内Object Lifetime Managerを参照即ち

class ShutdownHook { 
    ~ShutdownHook() { 
    // exit handler code 
    } 
}; 

int main() { 
    ShutdownHook h; 
    //... 
} 

ここでのクリーンアップ操作をオブジェクトのデストラクタに置くことができることを意味するC++ RAIIイディオムを、使用しています。リンクされたドキュメントでは、彼らは同様にatexit機能について議論します。

+0

を終了: –

+1

注意してください。これは動作保証されていません。例外がmain()をエスケープする場合、実装はスタックが巻き戻されているかどうかを定義します。したがって、この動作を保証するには、main()のすべての例外を捕捉する必要があります(コードをtryブロックに入れます)。あなたは何もする必要はありません。 –

0

どのような種類の終了もありません。 Linux上でKILLのように扱われないように設計されたシグナルがあります。

これらの信号は、すべてのメモリ、CPU、またはその他のリソースを消費したプログラムを終了するように設計されており、コンピュータをハンドラ機能の実行を困難にする状態にしています。

関連する問題