私はユーザー定義のデストラクタを持つクラスを持っています。クラスが最初にインスタンス化され、プログラムの実行中にSIGINTが発行された場合(UNIXではCTRL + Cを使用)、デストラクタは呼び出されますか? SIGSTP(unixではCTRL + Z)の動作は何ですか?SIGINTまたはSIGSTPが発行された場合、デストラクタが呼び出されますか?
答えて
デフォルトでは、ほとんどの信号は、プログラムの即時の異常終了を引き起こします。
しかし、ほとんどの信号のデフォルト動作を簡単に変更できます。あなたはこのプログラムとプレスコントロール-Cを実行する場合
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cstring>
#include <atomic>
std::atomic<bool> quit(false); // signal flag
void got_signal(int)
{
quit.store(true);
}
class Foo
{
public:
~Foo() { std::cout << "destructor\n"; }
};
int main(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = got_signal;
sigfillset(&sa.sa_mask);
sigaction(SIGINT,&sa,NULL);
Foo foo; // needs destruction before exit
while (true)
{
// do real work here...
sleep(1);
if(quit.load()) break; // exit normally after SIGINT
}
return 0;
}
は、あなたが単語「デストラクタ」を参照してくださいする必要があります
このコードは、すべての通常のデストラクタを呼び出すなど、通常は信号出口プログラムを作成する方法を示しています印刷されます。シグナルハンドラ関数(got_signal)は、実際にあなたが何をしているのか分からない限り、フラッグを設定して静かに戻す以外にはめったに何もするべきではないことに注意してください。
ほとんどのシグナルは上に示したようにキャッチ可能ですが、SIGKILLではなく、制御できません。SIGKILLは暴走プロセスを強制終了する最後の方法であり、ユーザーがプロセスを凍結させるSIGSTOPではないからです。必要に応じてSIGTSTP(control-Z)をキャッチすることができますが、シグナルに関心があるのはデストラクタの振る舞いである必要はありません。最終的には制御-Zの後にプロセスが起動し、実行を継続し、すべてのデストラクタを有効にして正常に終了します。
これらのシグナルを自分で処理しない場合は、いいえ、デストラクタは呼び出されません。ただし、オペレーティングシステムは、プログラムの終了時に使用したリソースを再利用します。
信号を自分で処理する場合は、sigaction
標準ライブラリ関数をチェックアウトすることを検討してください。
OSが所有するリソースを再利用します。アプリケーション内には他のリソースがあり、通常はそれらを正しく閉じるようにラップされます(そうしないと、正しく終了していないファイルなど)。 –
はのは、それを試してみましょう:
#include <stdio.h>
#include <unistd.h>
class Foo {
public:
Foo() {};
~Foo() { printf("Yay!\n"); }
} bar;
int main(int argc, char **argv) {
sleep(5);
}
そして:
$ g++ -o test ./test.cc
$ ./test
^C
$ ./test
Yay!
だから私はあなたがそれをキャッチする必要があります、恐れていませんよ。
SIGSTOP
はキャッチできず、SIGCONT
が送信されるまでプロセスを一時停止します。
- 1. rvalueデストラクタが呼び出されたか/これはokです
- 2. C++デストラクタが呼び出されませんでしたか?
- 3. クラッシュが発生した場合applicationWillTerminateが呼び出されますか?
- 4. スタティックインスタンス、デストラクタが呼び出されない
- 5. dylibデストラクタが呼び出されない
- 6. python - StringVar()でset()が呼び出された場合、tkinterウィジェットへのバインドが2回呼び出されます
- 7. サブクラスのデストラクタが呼び出された場合は、そのベースクラスのデストラクタの呼び出しを停止できますか?
- 8. NSURLSessionTask再開が呼び出された場合、オブジェクトdeallocは呼び出されません
- 9. サービスが呼び出され、時にはサービスが呼び出されない場合があります
- 10. .batファイルはそれ自身で実行されますが、スケジュールされたタスクによって呼び出された場合は実行されません
- 11. dlopenされたライブラリからdlopen()が呼び出された場合、ロード・リークはありますか?
- 12. QLPreviewControllerデリゲートメソッドはiOS 10では呼び出されませんが、iOS 10より前に実行された場合に呼び出されます
- 13. JNI関数からJava例外がスローされた後にC++デストラクタが呼び出されますか?
- 14. exit()を呼び出すときにデストラクタが実行されますか?
- 15. エラーが発生した場合、firebaseコールバック関数が呼び出されない
- 16. doAfterSuccessでエラーが発生した場合オブザーバーonErrorが呼び出されない
- 17. その場合、そのmapView:viewForAnnotation:が呼び出されますか?
- 18. 呼び出されるたびにPHP関数が実行されますか?
- 19. Node.JS:requireまたは直接コマンドラインから呼び出された場合の検出
- 20. デストラクタが呼び出されないのはなぜですか?
- 21. デストラクタが呼び出されるのはなぜですか?
- 22. Greasemonkey発行のリダイレクトは、リダイレクトラインの後にalert()が呼び出された場合にのみ機能します
- 23. デストラクタを追加した後、プログラムが呼び出される前にエラーが発生しました
- 24. どのオーバーロードされたメソッドが呼び出されますか?
- 25. ユニットテストデリゲートアクションが呼び出されました
- 26. オブジェクトが呼び出されました
- 27. ajaxがロードされたテンプレート内で呼び出された場合、Ajaxは機能しませんか?
- 28. pthread_key_createデストラクタが何度も呼び出されたのはなぜですか?
- 29. クラスメソッドの場合はコールバックが呼び出されません
- 30. URLスキームが呼び出された場合のアプリケーションストアへのリダイレクト
IIRCの場合、 'quit'の正しい型は' volatile std :: sig_atomic_t'です。その目的のために 'bool'を使うのはUBです。 – MSalters
@MSalters:そうです、sigaction()の前にsigfillset()呼び出しを含めるべきでしょう。おそらくsig_atomic_tよりも優れています。ブールを使用することは、信号ハンドラの中断を防ぐために追加の信号がブロックされている場合には、より慣れており、完全に安全です。サンプルコードを編集しました。ありがとうございます。 –
私は実際に、このコードで 'quit = false'行に' '削除された関数の使用' 'というエラーを受け取ります。 'quit = false'の代わりに' quit(false) 'をしなければなりません。また、このコードはWindowsでは動作しません。 'SetConsoleCtrlHandler()'を使わなければなりません。 – Timmmm