知識ベース

シグアップ

POSIX準拠のプラットフォームでは、SIGHUPは (「SIG NAL 時間 ANG アップ 」)、その制御端末を閉じたときにプロセスに送られる信号です。 (もともとは、プロセスにシリアル回線のドロップを通知するように設計されていました。)SIGHUPは、ヘッダーファイルsignal.hで定義されている記号定数です。

歴史

長年にわたるコンピュータシステムへのアクセスは、シリアルラインとRS-232プロトコルを介して端末をメインフレームシステムに接続することで構成されていました。このため、信号と呼ばれるソフトウェア割り込みシステムが開発されていたとき、信号は「ハングアップ」で使用するように指定されていました。

多くの場合、接続しているユーザーがモデムをハングアップして接続を終了したため、シリアルラインが切断されたときにSIGHUPがプログラムに送信されます。システムは、失われたデータキャリア検出(DCD)信号を介して回線が切断されたことを検出します。

シグナルは常にプロセス間通信(IPC)の便利な方法でしたが、初期の実装では、プログラムが独自の目的のためにインターセプトおよび解釈できるユーザー定義可能なシグナル(SIGUSR1およびSIGUSR2の後の追加など)はありませんでした。このため、デーモンなどの制御端末を必要としないアプリケーションは、SIGHUPを構成ファイルの再読み取りまたは再初期化のシグナルとして再利用します。この規則は、ApacheやSendmailなどのパッケージで今日まで残っています。

現代の使用法

シリアル回線を介したアクセスの減少に伴い、SIGHUPの意味は現代のシステムで多少変更され、多くの場合、制御擬似端末または仮想端末が閉じられたことを意味しています。コマンドがターミナルウィンドウ内で実行され、コマンドプロセスの実行中にターミナルウィンドウが閉じられると、SIGHUPを受け取ります。

SIGHUPを受け取るプロセスがUnixシェルの場合、ジョブ制御の一部として、多くの場合、シグナルをインターセプトし、子プロセス(より正確には、シェルによって内部的に表されるプロセスグループ、 「ジョブ」)、デフォルトでそれらを終了します。

これは2つの方法で回避できます。最初に、Single UNIX Specificationはnohupと呼ばれるシェルユーティリティを記述します。これは、プログラムを起動し、デフォルトでSIGHUPを無視させるラッパーとして使用できます。次に、ジョブIDでdisownを呼び出すことで子プロセスグループを「disowned」できます。これにより、シェルのジョブテーブルからプロセスグループが削除されるため(SIGHUPは送信されません)、または(オプションで)ジョブテーブルに保持されますが、それらは、シェル終了時にSIGHUPを受信しません。

異なるシェルには、kshのdisown機能など、SIGHUPを制御および管理する他の方法もあります。最新のLinuxディストリビューションのドキュメントでは、kill -HUP processID>を使用してSIGHUPシグナルを送信するように指定しています。

デーモンプログラムは、SIGHUPを自分自身を再起動するための信号として使用することがあります。これは、変更された構成ファイルを再読み取りすることが最も一般的な理由です。

詳細

シグナル番号はプラットフォームによって異なるため、シンボリック信号名が使用されますが、XSI準拠のシステムでは、数値定数1を使用してSIGHUPを示すことができます。

SIGHUPを処理できます。つまり、プログラマーは、関数の呼び出し、関数の無視、デフォルトアクションの復元など、SIGHUPの受信時に実行するアクションを定義できます。

POSIX準拠のシステムでのデフォルトのアクションは、異常終了です。

参照資料

  1. ^ Kerrisk、マイケル、編。 (2009年7月25日)、「SIGNAL(7)」、 Linuxプログラマーズマニュアル(バージョン3.22) 、Linuxカーネルアーカイブ、2009年9月23日検索。
  2. ^ Garrels、Machtelt、編(2008年12月27日)、「Signals」、 初心者向けBashガイド、ver。 1.11 、Linuxドキュメントプロジェクト、2009年9月23日取得。
  3. ^ Kerrisk、マイケル、編。 (2009年7月25日)、「KILL(2)」、 Linuxプログラマーズマニュアル(バージョン3.22) 、Linuxカーネルアーカイブ、2009年9月23日検索。