私はLinuxユーザとして答えていますが、これはすべてのウィンドウに適用されるべきです。
私はこのような質問をしていましたので、以前の回答を要約して私の2セントを追加してください。
信号とabort()
:^C
と^Z
は、exit()で終了する前に関数を呼び出すために「傍受される」可能性があります。シグナルSIGQUIT
AKA ^\
およびSIGKILL
はキーストロークを持たず、傍受できません。次に、csignal
ヘッダーとC++ラムダの使用例を示します。
#include <iostream>
#include <csignal>
#include <cstdlib>
using namespace std;
int main()
{
//signal requires lam take an int parameter
//this parameter is equal to the signals value
auto lam =
[] (int i) { cout << "aborting" << endl; exit(0); };
//^C
signal(SIGINT, lam);
//abort()
signal(SIGABRT, lam);
//sent by "kill" command
signal(SIGTERM, lam);
//^Z
signal(SIGTSTP, lam);
while(1)
{
}
return 0;
}
終了:私は上記の私の例でexit()
を使用しているので、注意がここで注意する必要があります。実行されている関数が一度だけ実行する必要のあるクリーンアップ関数の場合は、おそらく静的変数has_run
を使用できます。上記の例では、raise()
は傍受できない信号です。しかし、これらはコアダンプが付いてくる傾向があります。あなたの選択、ここ。例は
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
//called with no parameters
auto lam = []() { cout << "at exit"; };
atexit(lam);
return 0;
}
注意し、以下のC++ 11は、上記と同様の作用伴うat_quick_exit
を有するquick_exit
を追加しました。しかし、quick_exit
ではクリーンアップタスクは実行されません。対照的に、exit
ではオブジェクトデストラクタが呼び出され、Cストリームは閉じられ、自動ストレージ変数のみがクリーンアップされません。
すべての場合では可能ではありません。信号の中には、必要に応じてすぐにプロセスを停止させるものがあります。 (スタックオーバフローなど) –
どのオペレーティングシステムですか? –