名前
signal - 使用可能なシグナルの一覧
説明
Linux は POSIX 信頼シグナル (reliable signal; 以後 "標準シグナル"と表記) と POSIX リアルタイムシグナルの両方に対応している。
シグナル処理方法
シグナルはそれぞれ現在の「処理方法 (disposition)」を保持しており、 この処理方法によりシグナルが配送された際にプロセスが どのような振舞いをするかが決まる。
後述の表の "動作" の欄のエントリは各シグナルのデフォルトの 処理方法を示しており、以下のような意味を持つ。
Term | デフォルトの動作はプロセスの終了。 |
Ign | デフォルトの動作はこのシグナルの無視。 |
Core | デフォルトの動作はプロセスの終了とコアダンプ出力 (core(5) 参照)。 |
Stop | デフォルトの動作はプロセスの一時停止。 |
Cont | デフォルトの動作は、プロセスが停止中の場合にその実行の再開。 |
シグナルの処理方法はプロセス単位の属性である。 マルチスレッドのアプリケーションでは、あるシグナルの処理方法は 全てのスレッドで同じである。
シグナルマスクと処理待ちシグナル
シグナルは ブロック (block) されることがある。ブロックされると、そのシグナルは その後ブロックを解除されるまで配送されなくなる。 シグナルが生成されてから配送されるまでの間、そのシグナルは 処理待ち (pending) であると呼ばれる。
プロセス内の各スレッドは、それぞれ独立な シグナルマスク (signal mask) を持つ。シグナルマスクはそのスレッドが現在ブロックしている シグナル集合を示すものである。 スレッドは、 pthread_sigmask(3) を使って自分のシグナルマスクを操作できる。 伝統的なシングルスレッドのアプリケーションでは、 sigprocmask(2) を使って、シグナルマスクを操作できる。
生成されるシグナル (したがって処理待ちとなるシグナル) には、 プロセス全体宛てと特定のスレッド宛てがある。 例えば、プロセス全体宛てのシグナルは kill(2) を使って送信される。 特定のマシン語の命令の実行の結果として生成される、 SIGSEGV や SIGFPE などのシグナルは、スレッド宛てとなる。 また、 pthread_kill(2) を使って特定のスレッド宛てに生成されたシグナルも スレッド宛てとなる。 プロセス宛てのシグナルは、そのシグナルをブロックしていないスレッドのうち いずれかの一つに配送することができる。そのシグナルをブロックしていない スレッドが複数ある場合、シグナルを配送するスレッドはカーネルが 無作為に選択する。
スレッドは、 sigpending(2) を使って、現在処理待ちのシグナル集合を取得することができる。 この集合は、プロセス宛ての処理待ちシグナルと 呼び出したスレッド宛てのシグナルの両方から構成される。
標準シグナル
Linux は以下に示す標準シグナルに対応している。 シグナル番号の一部はアーキテクチャ依存であり、"値" 欄に示す通りである。 (3つの値が書かれているものは、 1つ目が alpha と sparc で通常有効な値、 真ん中が i386, ppc, sh での値、最後が mips での値である。 - はそのアーキテクチャにおいて対応するシグナルがないことを示す。)
最初に、POSIX.1-1990 に定義されているシグナルを示す。
シグナル | 値 | 動作 | コメント |
制御端末(controlling terminal)のハングアップ検出、 | |||
または制御しているプロセスの死 | |||
SIGINT | 2 | Term | キーボードからの割り込み (Interrupt) |
SIGQUIT | 3 | Core | キーボードによる中止 (Quit) |
SIGILL | 4 | Core | 不正な命令 |
SIGABRT | 6 | Core | abort(3) からの中断 (Abort) シグナル |
SIGFPE | 8 | Core | 浮動小数点例外 |
SIGKILL | 9 | Term | Kill シグナル |
SIGSEGV | 11 | Core | 不正なメモリ参照 |
SIGPIPE | 13 | Term | パイプ破壊: 読み手の無いパイプへの書き出し |
SIGALRM | 14 | Term | alarm(2) からのタイマーシグナル |
SIGTERM | 15 | Term | 終了 (termination) シグナル |
SIGUSR1 | 30,10,16 | Term | ユーザ定義シグナル 1 |
SIGUSR2 | 31,12,17 | Term | ユーザ定義シグナル 2 |
SIGCHLD | 20,17,18 | Ign | 子プロセスの一旦停止 (stop) または終了 |
SIGCONT | 19,18,25 | Cont | 一旦停止 (stop) からの再開 |
SIGSTOP | 17,19,23 | Stop | プロセスの一旦停止 (stop) |
SIGTSTP | 18,20,24 | Stop | 端末 (tty) より入力された一旦停止 (stop) |
SIGTTIN | 21,21,26 | Stop | バックグランドプロセスの tty 入力 |
SIGTTOU | 22,22,27 | Stop | バックグランドプロセスの tty 出力 |
シグナル SIGKILL と SIGSTOP はキャッチ、ブロック、無視できない。
次に、 POSIX.1-1990 標準にはないが、 SUSv2 と POSIX.1-2001 に記述されているシグナルを示す。
シグナル | 値 | 動作 | コメント |
SIGPOLL | Term | ポーリング可能なイベント (Sys V)。 SIGIOと同義 | |
SIGPROF | 27,27,29 | Term | profiling タイマの時間切れ |
SIGSYS | 12,-,12 | Core | ルーチンへの引き数が不正 (SVr4) |
SIGTRAP | 5 | Core | トレース/ブレークポイント トラップ |
SIGURG | 16,23,21 | Ign | ソケットの緊急事態 (urgent condition) (4.2BSD) |
SIGVTALRM | 26,26,28 | Term | 仮想アラームクロック (4.2BSD) |
SIGXCPU | 24,24,30 | Core | CPU時間制限超過 (4.2BSD) |
SIGXFSZ | 25,25,31 | Core | ファイルサイズ制限の超過 (4.2BSD) |
Linux 2.2 以前では、 SIGSYS, SIGXCPU, SIGXFSZ および SPARC と MIPS 以外のアーキテクチャでの SIGBUS のデフォルトの振る舞いは (コアダンプ出力なしの) プロセス終了であった。 (他の Unix システムにも SIGXCPU と SIGXFSZ のデフォルトの動作がコアダンプなしのプロセス終了のものがある。) Linux 2.4 では、POSIX.1-2001 での要求仕様に準拠して、 これらのシグナルで、プロセスを終了させ、コアダンプを出力する ようになっている。
次にその他の各種シグナルを示す。
シグナル | 値 | 動作 | コメント |
SIGEMT | 7,-,7 | ||
SIGSTKFLT | -,16,- | A | 数値演算プロセッサにおけるスタックフォルト (未使用) |
SIGIO | 23,29,22 | A | 入出力が可能になった (4.2BSD) |
SIGCLD | -,-,18 | SIGCHLD と同義 | |
SIGPWR | 29,30,19 | A | 電源喪失 (Power failure) (System V) |
SIGINFO | 29,-,- | SIGPWR と同義 | |
SIGLOST | -,-,- | A | ファイルロックが失われた |
SIGWINCH | 28,28,20 | B | ウィンドウ リサイズ シグナル (4.3BSD, Sun) |
SIGUNUSED | -,31,- | A | 未使用シグナル (SIGSYS となるだろう) |
(シグナル 29 は alpha では SIGINFO / SIGPWR だが、sparc では SIGLOST である。)
SIGEMT は POSIX.1-2001 に規定されていないが、 その他の多くの Unix システムに存在する。 デフォルトの動作は多くの場合、コアダンプ出力を伴うプロセスの終了である。
SIGPWR は (POSIX.1-2001 に規定されていないが) このシグナルが存在する 他の Unix システムでは多くの場合、デフォルト動作は無視である。
SIGIO は (POSIX.1-2001 に規定されていないが) いくつかの他の Unix システムでは デフォルト動作は無視である。
リアルタイムシグナル
Linux は 元々は POSIX.1b リアルタイム拡張で定義されており (今では POSIX.1-2001 に含まれている) リアルタイムシグナルに対応している。 Linux は 32 個のリアルタイムシグナルに対応しており、 32 (SIGRTMIN) から 63 (SIGRTMAX) の番号が振られている。 (プログラムではリアルタイムシグナルを使うときは常に SIGRTMIN+n の形で参照すべきである。なぜならリアルタイムシグナルの番号は Unix の種類によって異なるからである)
標準シグナルと異なり、リアルタイムシグナルには 事前に定義された意味はない。 リアルタイムシグナルの全部をアプリケーションで定義した用途に使える。 (但し、LinuxThreads 実装で、リアルタイムシグナルの番号のうち 最初の 3つが使用されている点に注意すること)
ハンドリングしないリアルタイムシグナルのデフォルトの動作は 受信したプロセスの終了である。
リアルタイムシグナルは以下の特徴がある:
1. | リアルタイムシグナルは複数の実体をキューに入れることができる。 一方、標準シグナルの場合、そのシグナルがブロックされている間に 同じシグナルの複数のインスタンスが配送されても、 1 つだけがキューに入れられる。 |
2. | シグナルが sigqueue(2) を用いて送信された場合、 付属データ (整数かポインタ) をシグナルと共に送信できる。 受信側プロセスが sigaction(2) に SA_SIGINFO フラグを指定してシグナルハンドラを設定した場合、 このデータは siginfo_t 構造体の si_value フィールド経由でハンドラの第 2 引き数として渡され、 利用することができる。 さらに、この構造体の si_pid と si_uid フィールドでシグナルを送信したプロセスの PID と実ユーザ ID を 得ることができる。 |
3. | リアルタイムシグナルでは配送される順序が保証される。 同じタイプのリアルタイムシグナルは送信された順番に到着する。 異なるリアルタイムシグナルが一つのプロセスに送信された場合、 番号の小さいシグナルから先に到着する。 (つまり小さい番号のシグナルが高い優先順位を持つ。) |
POSIX によれば、1 プロセス毎に最低 _POSIX_SIGQUEUE_MAX (32) 個の リアルタイムシグナルをキューに入れられるべきとしている。 しかし、 Linux では違った実装になっている。カーネル 2.6.7 までは (2.6.7 を含む)、全プロセスでキューに入っているリアルタイムシグナル の数の合計についてシステム全体での制限がある。 この制限は /proc/sys/kernel/rtsig-max ファイルで見ることができ、 (権限があれば) 変更もできる。 関係するファイルとして、 /proc/sys/kernel/rtsig-nr を見ることで、いくつのリアルタイムシグナルが現在キューに入っているかを 知ることができる。 Linux 2.6.8 で、これらの /proc 経由のインターフェースは、 RLIMIT_SIGPENDING リソース制限に置き換えられた。 これは、キューに入るシグナル数に関してユーザ単位に 上限を指定するものである。 詳しくは setrlimit(2) を参照。
非同期シグナルで安全な関数 (async-signal-safe functions)
他の場所の処理はプログラム実行の任意の箇所で中断されるため、 sigaction(2) や signal(2) で登録するシグナルハンドラ関数には非常に注意しなければならない。 POSIX には「安全な関数 (safe function)」という概念がある。 シグナルが安全でない関数の実行を中断し、かつ handler が安全でない関数を呼び出した場合、プログラムの挙動は未定義である。 POSIX.1-2003 では、 シグナルハンドラ内での安全な呼び出しを保証することが必須の関数として 以下が規定されている。
_Exit() _exit() abort() accept() access() aio_error() aio_return() aio_suspend() alarm() bind() cfgetispeed() cfgetospeed() cfsetispeed() cfsetospeed() chdir() chmod() chown() clock_gettime() close() connect() creat() dup() dup2() execle() execve() fchmod() fchown() fcntl() fdatasync() fork() fpathconf() fstat() fsync() ftruncate() getegid() geteuid() getgid() getgroups() getpeername() getpgrp() getpid() getppid() getsockname() getsockopt() getuid() kill() link() listen() lseek() lstat() mkdir() mkfifo() open() pathconf() pause() pipe() poll() posix_trace_event() pselect() raise() read() readlink() recv() recvfrom() recvmsg() rename() rmdir() select() sem_post() send() sendmsg() sendto() setgid() setpgid() setsid() setsockopt() setuid() shutdown() sigaction() sigaddset() sigdelset() sigemptyset() sigfillset() sigismember() signal() sigpause() sigpending() sigprocmask() sigqueue() sigset() sigsuspend() sleep() socket() socketpair() stat() symlink() sysconf() tcdrain() tcflow() tcflush() tcgetattr() tcgetpgrp() tcsendbreak() tcsetattr() tcsetpgrp() time() timer_getoverrun() timer_gettime() timer_settime() times() umask() uname() unlink() utime() wait() waitpid() write().
準拠
POSIX.1
バグ
SIGIO と SIGLOST は同じ値を持っている。 SIGLOST はカーネルのソースではコメントアウトされている。 しかし、ソフトウェアによってはビルドの過程でシグナル 29 を SIGLOST とみなしてしまうものがある。
関連項目
kill(1), kill(2), killpg(2), setitimer(2), setrlimit(2), sigaction(2), signal(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2), sigwaitinfo(2), bsd_signal(3), raise(3), sigvec(3), sigset(3), strsignal(3), sysv_signal(3), core(5), proc(5), pthreads(7)