信号処理の選択?

信号処理の選択?

APUEから

プロセスには信号処理のための3つのオプションがあります。

  1. 信号を無視してください。このオプションは、ゼロで除算したり、プロセスアドレス空間外のメモリ参照などのハードウェア例外を示す信号には推奨されません。結果が定義されていないからです。

  2. 基本的な操作を実行します。 0で割る場合、デフォルトはプロセスを終了することです。

  3. シグナルが発生したときに呼び出される関数を提供します(これをシグナル「キャッチ」と呼びます)。独自の機能を提供することで、信号がいつ発生するかを知ることができ、必要に応じて処理できます。

  1. 私は2つのオプションしかないと思います。上記の最後の2つと両方が「信号を無視する」ことができます(上記の最初のオプション)。

    私の理解は正しいですか、それとも実際に見積もりに重ならない3つの選択肢がありますか?なぜ?

  2. この本では、いくつかの信号の基本的な動作はこれを無視することです。これは、信号の動作がSIG_IGN、SIG_DFL、または空の関数であることを意味しますか?たとえば、

    これ基本SIGCHLDの動作は次のとおりです。無視される。これらのオプションについては、第10章で説明します。

    信号制御: 基本 タスクは停止したプロセスを続行することですが、 無視するプロセスが停止していない場合はシグナルを送信します。

ありがとうございます。

答え1

もちろん、何もしないシグナルハンドラを作成してシグナルを効果的に無視することもできますが、最初のオプションはシステムコールの引数を使用SIG_IGNしてシグナルを無視することですsignal()

したがって、コードに関してSIGINT信号を仮定すると、3つのオプションがあります。

  • signal(SIGINT, SIG_IGN);無視する
  • 関数を呼び出さないでください。または、プロセスを終了するデフォルトの動作が発生するようにsignal()呼び出さないでください。signal(SIGINT, SIG_DFL);
  • signal(SIGINT, termination_handler);termination_handler()信号が最初に発生したときに呼び出される関数はどこにありますか?

源泉:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html

特定のシグナルケースでは、基本的な操作はシグナルを無視することであり、最初の2つのオプション(SIG_IGNおよびSIG_DFL)は同じです。 (小さい)オーバーヘッドを除外すると、空のハンドラ関数を生成しても顕著な効果がない可能性があります。

注:signal()この回答は単純化のために使用されていますが、sigaction()移植性のために新しいコードではお勧めします。

関連情報