13

私が使う:

signal(SIGINT, CtrlHandler);

SIGINTイベントのハンドラーを追加します。しかし、どうすればこのハンドラーを削除できますか?

4

1 に答える 1

23

これがあなたがすることです:

signal(SIGINT, SIG_DFL);

これにより、シグナルハンドラーは、そのシグナルのデフォルトの動作(設定されていない場合のデフォルトの処理を含む)にリセットされます。SIGINTの場合、コアダンプなしでプロセスを中止します。

のマニュアルでsignalは、これが機能する理由を説明しています。

signal(signum, handler)シグナルの処理signumを、、、またはプログラマー定義関数(「シグナルハンドラー」)のアドレスのhandlerいずれかSIG_IGNに設定します。SIG_DFL...処理がに設定されている場合SIG_DFL、シグナルに関連付けられたデフォルトのアクションが発生します。

この情報は、manコマンドを使用して見つけることもできます。コマンドラインで入力man signalして読み通すと、表示されるはずです。

これは、システムのデフォルトのシグナルハンドラーを置き換えた場合に非常に固有です。状況によっては、最初にそこにあったハンドラーを単純に復元する必要があります。その定義を見ると、signal次のようになります。

sighandler_t signal(int signum, sighandler_t handler);

したがって、を返しますsighandler_t。それsighandler_tが返すものは、信号の以前の「性質」を表します。したがって、これを処理する別の方法は、返される値を保存し、独自のハンドラーを削除するときにその値を復元することです。

于 2013-01-25T19:19:00.503 に答える