信号を処理する選択肢は?

信号を処理する選択肢は?

APUEより

プロセスには、シグナルを処理するための 3 つの選択肢があります。

  1. シグナルを無視します。このオプションは、結果が未定義となるため、ゼロ除算やプロセスのアドレス空間外のメモリの参照など、ハードウェア例外を示すシグナルには推奨されません。

  2. デフォルトのアクションを実行します。ゼロ除算条件の場合、デフォルトではプロセスを終了します。

  3. シグナルが発生したときに呼び出される関数を提供します (これをシグナルの「キャッチ」と呼びます)。独自の関数を提供することで、シグナルが発生したタイミングがわかり、必要に応じて処理できるようになります。

  1. 選択肢は 2 つしかないと思います。上記の最後の 2 つです。どちらも「信号を無視」できます (上記の最初の選択肢)。

    私の理解は正しいでしょうか、それとも引用文にあるように重複しない選択肢が 3 つあるのでしょうか? なぜでしょうか?

  2. この本には、一部のシグナルのデフォルトのアクションはそれを無視することであると書かれています。これは、シグナルのアクションが SIG_IGN または SIG_DFL または空の関数であることを意味しますか? たとえば、次のようになります。

    デフォルトSIGCHLDのアクションは無視されたこれらのオプションについては第 10 章で説明します。

    SIGCONT: デフォルト アクションは停止したプロセスを継続することですが、 無視するプロセスが停止されなかった場合の信号。

ありがとう。

答え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_IGNSIG_DFL) は同じです。空のハンドラー関数を作成しても、(小さな) オーバーヘッド以外に目に見える効果はおそらくないでしょう。

注:signal()この回答では簡潔にするために が使用されていますが、新しいコードではsigaction()移植性の理由から が推奨されます。

関連情報