SIGINT は、SIGTERM、SIGQUIT、SIGKILL などの他の終了シグナルとどのように関係しますか? 質問する

SIGINT は、SIGTERM、SIGQUIT、SIGKILL などの他の終了シグナルとどのように関係しますか? 質問する

POSIX システムでは、終了シグナルは通常、次の順序になります (多くの MAN ページと POSIX 仕様による)。

  1. シグナルターム- プロセスに終了を丁寧に依頼します。プロセスは、すべてのリソース (ファイル、ソケット、子プロセスなど) をクリーンアップし、一時ファイルなどを削除して、正常に終了します。

  2. 終了- より強力なリクエスト。クリーンアップが絶対に必要なリソースはクリーンアップしたまま、正常に終了しない可能性がありますが、一時ファイルは削除されず、デバッグ情報がどこかに書き込まれる可能性があります。一部のシステムでは、コア ダンプも書き込まれます (シグナルがアプリによってキャッチされるかどうかに関係なく)。

  3. シグナルキル- 最も強力な要求。プロセスは何も要求されませんが、システムは、それが望むかどうかに関係なく、プロセスをクリーンアップします。コア ダンプが書き込まれる可能性が最も高くなります。

は、この図にどのように当てはまるでしょうかSIGINT? CLI プロセスは通常、SIGINTユーザーが を押すとによって終了しますが、バックグラウンド プロセスも ユーティリティを使用しCRTL+Cて終了できます。仕様やヘッダー ファイルでは、 が よりも強力か弱いか、またはと の間に何らかの違いがあるかどうかはわかりません。SIGINTKILLSIGINTSIGTERMSIGINTSIGTERM

アップデート:

終了信号に関する最も良い説明は、GNU LibC ドキュメントSIGTERM と SIGQUIT の間には意図的な違いがあることが非常にわかりやすく説明されています。

それは約と述べていますSIGTERM

これは、プログラムを終了するよう丁寧に依頼する通常の方法です。

そして、それは次のように述べていますSIGQUIT:

[...] プロセスを終了するときに、プログラム エラー信号と同様にコア ダンプを生成します。これは、ユーザーが「検出」したプログラム エラー状態と考えることができます。 [...] SIGQUIT の処理では、特定の種類のクリーンアップを省略するのが最適です。たとえば、プログラムが一時ファイルを作成する場合、一時ファイルを削除することで他の終了要求を処理する必要があります。ただし、SIGQUIT では一時ファイルを削除しない方が適切です。そうすれば、ユーザーはコア ダンプと併せて一時ファイルを調べることができます。

また、SIGHUP十分に説明されています。SIGHUP は実際には終了信号ではなく、ユーザーとの「接続」が失われたことを意味するだけなので、アプリはユーザーがそれ以上の出力 (stdout/stderr 出力など) を読み取ることを期待できず、ユーザーからの入力も期待できません。ほとんどのアプリにとって、これは終了したほうがよいことを意味します。理論上は、アプリは SIGHUP を受信するとデーモン モードに入り、バックグラウンド プロセスとして実行され、構成されたログ ファイルに出力を書き込むように決定することもできます。バックグラウンドで既に実行されているほとんどのデーモンにとって、SIGHUP は通常、構成ファイルを再検査する必要があることを意味します。そのため、構成ファイルを編集した後、バックグラウンド プロセスに送信します。

ただし、このページには、CRTL + C によって送信されるという以外に、SIGINT に関する有用な説明はありません。 とはSIGINT異なる方法で処理する理由はありますかSIGTERM? もしそうなら、その理由は何ですか、また処理はどのように異なりますか?

ベストアンサー1

SIGTERMSIGKILL一般的な用途向けに設計されている「このプロセスを終了」要求。SIGTERM(デフォルト) およびSIGKILL(常に) はプロセスを終了します。SIGTERMプロセスによってキャッチされる (たとえば、必要に応じて独自のクリーンアップを実行できるようにする) か、完全に無視される可能性がありますが、SIGKILLキャッチまたは無視することはできません。

SIGINTおよび は、SIGQUIT端末からの要求専用です。特定の入力文字を割り当てて、これらの信号を生成することができます (端末制御設定によって異なります)。 のデフォルトのアクションは、 のSIGINTデフォルトのアクションSIGTERMや の変更不可能なアクションと同じ種類のプロセス終了です。SIGKILLのデフォルトのアクションSIGQUITもプロセス終了ですが、コア ダンプの生成など、実装定義の追加アクションが発生する場合があります。 どちらも、必要に応じてプロセスによってキャッチまたは無視できます。

SIGHUPは、おっしゃるとおり、終了信号そのものというよりは、端末接続が失われたことを示すためのものです。しかし、繰り返しになりますが、 のデフォルトのアクションは(プロセスがこれをキャッチまたは無視しない場合)、 etcSIGHUPと同じ方法でプロセスを終了することです。SIGTERM

テーブルがありますPOSIXの定義signal.hさまざまなシグナルとそのデフォルトのアクションと目的を一覧表示し、一般的な端末インターフェースこの章では、端末関連の信号についてさらに詳しく説明します。

おすすめ記事