シグナル - Linux / Unixコマンド

Linuxは、POSIXの信頼性の高い信号(以下、「標準信号」といいます)とPOSIXのリアルタイム信号の両方をサポートします。

標準信号

Linuxは以下の標準信号をサポートしています。 「値」列に示されているように、いくつかの信号番号はアーキテクチャに依存しています。 (3つの値が与えられている場合、最初はalphaとsparc、i386、ppc、shの場合は真ん中、mipsの場合は最後に有効です。

A-は、対応するアーキテクチャ上に信号が存在しないことを示す)。

表の「Action」列のエントリは、次のように信号のデフォルト動作を指定します。

期間

デフォルトのアクションは、プロセスを終了することです。

Ign

デフォルトの動作は、信号を無視することです。

コア

デフォルトのアクションは、プロセスを終了しコアをダンプすることです。

やめる

デフォルトのアクションは、プロセスを停止することです。

まず、元のPOSIX.1標準で記述されているシグナル。

信号 アクション コメント
または制御プロセスの死
SIGINT 2 期間 キーボードからの割り込み
SIGQUIT 3 コア キーボードから終了する
SIGILL 4 コア 違法命令
SIGABRT 6 コア アボートからのアボート信号(3)
SIGFPE 8 コア 浮動小数点例外
SIGKILL 9 期間 キル信号
SIGSEGV 11 コア 無効なメモリ参照
SIGPIPE 13 期間 壊れたパイプ:読者がいないパイプに書き込む
SIGALRM 14 期間 アラームからのタイマー信号(2)
SIGTERM 15 期間 終了信号
SIGUSR1 30,10,16 期間 ユーザ定義信号1
SIGUSR2 31,12,17 期間 ユーザ定義信号2
SIGCHLD 20,17,18 Ign 子供が停止または終了した
SIGCONT 19,18,25 停止したら続行
SIGSTOP 17,19,23 やめる プロセスを停止する
SIGTSTP 18,20,24 やめる ttyで停止します
シグニティン 21,21,26 やめる バックグラウンドプロセスのtty入力
SIGTTOU 22,22,27 やめる バックグラウンドプロセスのtty出力

シグナルSIGKILLSIGSTOPはキャッチ、ブロック、または無視できません。

次に、POSIX.1規格ではないが、SUSv2とSUSv3 / POSIX 1003.1-2001に記述されている信号。

信号 アクション コメント
SIGPOLL 期間 ポーリング可能イベント(Sys V)。 SIGIOの同義語
SIGPROF 27,27,29 期間 プロファイリングタイマーの有効期限切れ
SIGSYS 12、 - 、12 コア ルーチンへの引数が不正(SVID)
SIGTRAP 5 コア トレース/ブレークポイントトラップ
SIGURG 16,23,21 Ign ソケットの緊急状態(4.2 BSD)
SIGVTALRM 26,26,28 期間 仮想アラームクロック(4.2 BSD)
SIGXCPU 24,24,30 コア CPU時間制限を超えました(4.2 BSD)
SIGXFSZ 25,25,31 コア ファイルサイズの上限を超えました(4.2 BSD)

SIGSYSSIGXCPUSIGXFSZ 、および(SPARCおよびMIPS以外のアーキテクチャの) SIGBUSのデフォルトの動作であるLinux 2.2以降では、 SIGBUSは(コアダンプなしで)プロセスを終了させることでした。 (他のいくつかのUnixでは、 SIGXCPUSIGXFSZのデフォルトアクションは、コアダンプなしでプロセスを終了させることです)。Linux 2.4は、これらのシグナルに対するPOSIX 1003.1-2001の要件に準拠しており、コアダンプでプロセスを終了します。

次に様々な信号。

信号 アクション コメント
SIGEMT 7、 - 、7 期間
SIGSTKFLT - 、16、 - 期間 コプロセッサのスタック障害(未使用)
SIGIO 23,29,22 期間 I / Oが可能になりました(4.2 BSD)
SIGCLD - 、 - 、18 Ign SIGCHLDの同義語
SIGPWR 29,30,19 期間 停電(システムV)
SIGINFO 29、 - 、 - SIGPWRの同義語
SIGLOST - 、 - 、 - 期間 ファイルロックが失われました
SIGWINCH 28,28,20 Ign ウィンドウサイズ変更信号(4.3 BSD、Sun)
SIGUNUSED - 、31、 - 期間 未使用の信号(SIGSYSになります)

(信号29はアルファのSIGINFO / SIGPWR ですが、sparcのSIGLOSTです)。

SIGEMTはPOSIX 1003.1-2001には指定されていませんが、ほとんどの他のUnixには表示されません。デフォルトのアクションは通常コアダンプでプロセスを終了させることです。

SIGPWR (これはPOSIX 1003.1-2001で指定されていません)は、表示される他のUnixではデフォルトでは通常無視されます。

SIGIO (POSIX 1003.1-2001で指定されていない)は、他のいくつかのUnixではデフォルトで無視されます。

リアルタイム信号

Linuxは、もともとPOSIX.4のリアルタイム拡張で定義されたリアルタイム信号をサポートしています(POSIX 1003.1-2001にも含まれています)。 Linuxは、32( SIGRTMIN )から63( SIGRTMAX )までの32個のリアルタイム信号をサポートしています。 (リアルタイムシグナル番号の範囲はUnixによって異なるため、プログラムは常にSIGRTMIN + nという表記法を使用してリアルタイムシグナルを参照する必要があります)。

リアルタイム信号には、標準信号とは異なり、あらかじめ定義された意味がありません。リアルタイム信号のセット全体をアプリケーション定義の目的に使用できます。 (ただし、LinuxThreadsの実装では、最初の3つのリアルタイム信号が使用されます)。

未処理のリアルタイム信号に対するデフォルトのアクションは、受信プロセスを終了することです。

リアルタイム信号は、次のように区別されます。

  1. リアルタイム信号の複数のインスタンスをキューに入れることができます。 対照的に、標準信号の複数のインスタンスが配信されているときにその信号が現在ブロックされている場合は、1つのインスタンスのみがキューに入れられます。
  2. シグナルがsigqueue (2)を使用して送信される場合、付随する値(整数またはポインタ)がシグナルとともに送信されます。 受信プロセスがSA_SIGACTIONフラグを使用してこの信号のハンドラをsigaction (2)に設定すると、ハンドラへの第2引数として渡されたsiginfo_t構造体のsi_valueフィールドを介してこのデータを取得できます。 さらに、この構造体のsi_pidおよびsi_uidフィールドは、シグナルを送信するプロセスのPIDおよび実ユーザIDを取得するために使用できます。
  3. リアルタイム信号は、保証された順序で配信されます。 同じタイプの複数のリアルタイム信号は、送信された順に配信されます。 異なるリアルタイム信号がプロセスに送信された場合、信号は最も小さい番号の信号から順番に配信されます。 (つまり、番号の小さい信号が優先されます)。

標準シグナルとリアルタイムシグナルの両方がプロセスに対して保留中の場合、POSIXは指定されていないものを最初に配信します。 Linuxは、他の多くの実装と同様に、この場合は標準信号を優先します。

POSIXによれば、実装は少なくとも_POSIX_SIGQUEUE_MAX(32)のリアルタイムシグナルをプロセスにキューイングできるようにすべきです。 しかし、プロセスごとの制限を設けるのではなく、Linuxはすべてのプロセスのキューに入れられたリアルタイム信号の数にシステム全体の制限を課します。

この制限は、 / proc / sys / kernel / rtsig-maxファイルで変更できます(特権あり)。 関連するファイル/ proc / sys / kernel / rtsig-maxを使用して、現在キューに登録されているリアルタイム信号の数を調べることができます。

準拠

POSIX.1

重要: manコマンド( %man )を使用して、特定のコンピュータでコマンドがどのように使用されているかを確認してください。