+.\" t
+.\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
+.\" and Copyright (c) 2002, 2006 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" and Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk
+.\" <mtk.manpages@gmail.com>
+.\"
+.\" %%%LICENSE_START(VERBATIM)
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
+.\"
+.\" Modified Sat Jul 24 17:34:08 1993 by Rik Faith (faith@cs.unc.edu)
+.\" Modified Sun Jan 7 01:41:27 1996 by Andries Brouwer (aeb@cwi.nl)
+.\" Modified Sun Apr 14 12:02:29 1996 by Andries Brouwer (aeb@cwi.nl)
+.\" Modified Sat Nov 13 16:28:23 1999 by Andries Brouwer (aeb@cwi.nl)
+.\" Modified 10 Apr 2002, by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Modified 7 Jun 2002, by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Added information on real-time signals
+.\" Modified 13 Jun 2002, by Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Noted that SIGSTKFLT is in fact unused
+.\" 2004-12-03, Modified mtk, added notes on RLIMIT_SIGPENDING
+.\" 2006-04-24, mtk, Added text on changing signal dispositions,
+.\" signal mask, and pending signals.
+.\" 2008-07-04, mtk:
+.\" Added section on system call restarting (SA_RESTART)
+.\" Added section on stop/cont signals interrupting syscalls.
+.\" 2008-10-05, mtk: various additions
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH SIGNAL 7 2012\-05\-01 Linux "Linux Programmer's Manual"
+.SH 名前
+signal \- シグナルの概要
+.SH 説明
+Linux は POSIX 信頼シグナル (reliable signal; 以後 "標準シグナル"と表記) と POSIX
+リアルタイムシグナルの両方に対応している。
+.SS シグナル処理方法
+シグナルはそれぞれ現在の「処理方法 (disposition)」を保持しており、 この処理方法によりシグナルが配送された際にプロセスが
+どのような振舞いをするかが決まる。
+
+後述の表の "動作" の欄のエントリは各シグナルのデフォルトの 処理方法を示しており、以下のような意味を持つ。
+.IP Term
+デフォルトの動作はプロセス終了。
+.IP Ign
+デフォルトの動作はこのシグナルの無視。
+.IP Core
+デフォルトの動作はプロセス終了とコアダンプ出力 (\fBcore\fP(5) 参照)。
+.IP Stop
+デフォルトの動作はプロセスの一時停止。
+.IP Cont
+デフォルトの動作は、プロセスが停止中の場合にその実行の再開。
+.PP
+プロセスは、 \fBsigaction\fP(2) や \fBsignal\fP(2) を使って、シグナルの処理方法を変更することができる
+(\fBsignal\fP(2) の方がシグナルハンドラを設定する際の移植性が低い; 詳細は \fBsignal\fP(2) を参照)。
+シグナルの配送時に起こる動作として プロセスが選択できるのは、次のいずれか一つである。 デフォルトの動作を実行する、シグナルを無視する、
+\fIシグナルハンドラ (signal handler)\fP でシグナルを捕捉する。シグナルハンドラとは、シグナル配送時に
+自動的に起動されるプログラマ定義の関数である。 (デフォルトでは、シグナルハンドラは通常のプロセスのスタック上で起動される。
+シグナルハンドラが代替スタック (alternate stack) を使用するように設定する
+こともできる。代替スタックを使用するように設定する方法と、どのような際に 代替スタックが役に立つかについての議論については
+\fBsigaltstack\fP(2) を参照のこと。
+
+シグナルの処理方法はプロセス単位の属性である。 マルチスレッドのアプリケーションでは、あるシグナルの処理方法は 全てのスレッドで同じである。
+
+\fBfork\fP(2) 経由で作成された子プロセスは、親プロセスのシグナルの処理方法の コピーを継承する。
+\fBexecve\fP(2) の前後で、ハンドラが設定されているシグナルの処理方法はデフォルトにリセットされ、
+無視が設定されているシグナルの処理方法は変更されずそのままとなる。
+.SS シグナルの送信
+以下のシステムコールとライブラリ関数を使って、 呼び出し者はシグナルを送信することができる。
+.TP 16
+\fBraise\fP(3)
+呼び出したスレッドにシグナルを送る。
+.TP
+\fBkill\fP(2)
+指定されたプロセスや、指定されたプロセスグループの全メンバー、 システムの全プロセスにシグナルを送る。
+.TP
+\fBkillpg\fP(2)
+指定されたプロセスグループの全メンバーにシグナルを送る。
+.TP
+\fBpthread_kill\fP(3)
+呼び出し者と同じプロセス内の指定された POSIX スレッドにシグナルを送る。
+.TP
+\fBtgkill\fP(2)
+指定されたプロセス内の指定されたスレッドにシグナルを送る (このシステムコールを使って \fBpthread_kill\fP(3) は実装されている)。
+.TP
+\fBsigqueue\fP(3)
+指定されたプロセスに付属データとともにリアルタイムシグナルを送る。
+.SS シグナルが捕捉されるのを待つ
+以下のシステムコールを使って、シグナルが捕捉されるまで 呼び出したプロセスやスレッドの実行を中断 (suspend) することができる
+(ハンドラが設定されていないシグナルによりそのプロセスが終了した 場合にも実行の停止は終了する)。
+.TP 16
+\fBpause\fP(2)
+何かシグナルが捕捉されるまで実行を停止する。
+.TP
+\fBsigsuspend\fP(2)
+一時的にシグナルマスク (下記参照) を変更し、 マスクされていないシグナルのいずれかが捕捉されるまで 実行を中断する。
+.SS シグナルの同期受信
+シグナルハンドラ経由でシグナルを非同期 (asynchronously) で捕捉する以外にも、 シグナルを同期 (synchronously)
+して受け付けることもできる。 同期して受け付けるとは、シグナルが配送されるまで実行を停止 (block)
+するということである。シグナルを受け付けた際に、カーネルは そのシグナルに関する情報を呼び出し者に返す。 これを行う一般的な方法が二つある。
+.IP * 2
+\fBsigwaitinfo\fP(2), \fBsigtimedwait\fP(2), \fBsigwait\fP(3)
+は、指定されたシグナル集合のシグナルの一つが配送されるまで実行を中断する。 どのシステムコールや関数でも、配送されたシグナルに関する情報が返される。
+.IP *
+\fBsignalfd\fP(2) が返すファイルディスクリプタを使うと、呼び出し元に配送された シグナルに関する情報を読み出すことができる。
+このファイルディスクリプタからの \fBread\fP(2) は、 \fBsignalfd\fP(2)
+の呼び出し時に指定されたシグナル集合のシグナルの一つが呼び出し元に 配送されるまで停止 (block) する。 \fBread\fP(2)
+が返すバッファにはシグナルに関する情報を格納した構造体が入っている。
+.SS シグナルマスクと処理待ちシグナル
+シグナルは \fIブロック (block)\fP されることがある。ブロックされると、そのシグナルは その後ブロックを解除されるまで配送されなくなる。
+シグナルが生成されてから配送されるまでの間、そのシグナルは \fI処理待ち (pending)\fP であると呼ばれる。
+
+プロセス内の各スレッドは、それぞれ独立な \fIシグナルマスク (signal mask)\fP を持つ。シグナルマスクはそのスレッドが現在ブロックしている
+シグナル集合を示すものである。 スレッドは、 \fBpthread_sigmask\fP(3) を使って自分のシグナルマスクを操作できる。
+伝統的なシングルスレッドのアプリケーションでは、 \fBsigprocmask\fP(2) を使って、シグナルマスクを操作できる。
+
+\fBfork\fP(2) 経由で作成された子プロセスは親プロセスのシグナルマスクのコピーを継承する。 \fBexecve\fP(2)
+の前後でシグナルマスクは保持される。
+
+生成されるシグナル (したがって処理待ちとなるシグナル) には、 プロセス全体宛てと特定のスレッド宛てがある。 例えば、プロセス全体宛てのシグナルは
+\fBkill\fP(2) を使って送信される。 特定のマシン語の命令の実行の結果として生成される、 \fBSIGSEGV\fP や \fBSIGFPE\fP
+などのシグナルは、スレッド宛てとなる。 また、 \fBpthread_kill\fP(3) を使って特定のスレッド宛てに生成されたシグナルも
+スレッド宛てとなる。 プロセス宛てのシグナルは、そのシグナルをブロックしていないスレッドのうち
+いずれかの一つに配送することができる。そのシグナルをブロックしていない スレッドが複数ある場合、シグナルを配送するスレッドはカーネルが
+無作為に選択する。
+
+スレッドは、 \fBsigpending\fP(2) を使って、現在処理待ちのシグナル集合を取得することができる。
+この集合は、プロセス宛ての処理待ちシグナルと 呼び出したスレッド宛てのシグナルの両方から構成される。
+
+\fBfork\fP(2) 経由で作成された子プロセスでは、処理待ちのシグナル集合は空の集合で初期化される。 \fBexecve\fP(2)
+の前後で、処理待ちのシグナル集合は保持される。
+.SS 標準シグナル
+Linux は以下に示す標準シグナルに対応している。シグナル番号の一部はアー
+キテクチャ依存であり、"値" 欄に示す通りである。 (3つの値が書かれている
+ものは、 1つ目が alpha と sparc で通常有効な値、 真ん中が x86, arm や
+他のほとんどのアーキテクチャでの有効な値、最後が mips での値である。
+(parisc での値は記載されて\fIいない\fP。 parisc でのシグナル番号は
+Linux カーネルソースを参照してほしい)。 \- はそのアーキテ
+クチャにおいて対応するシグナルがないことを示す。)
+
+最初に、POSIX.1\-1990 に定義されているシグナルを示す。
+.TS
+l c c l
+____
+lB c c l.
+シグナル 値 動作 コメント
+SIGHUP \01 Term 制御端末(controlling terminal)のハングアップ検出、
+ または制御しているプロセスの死
+SIGINT \02 Term キーボードからの割り込み (Interrupt)
+SIGQUIT \03 Core キーボードによる中止 (Quit)
+SIGILL \04 Core 不正な命令
+SIGABRT \06 Core \fBabort\fP(3) からの中断 (Abort) シグナル
+SIGFPE \08 Core 浮動小数点例外
+SIGKILL \09 Term Kill シグナル
+SIGSEGV 11 Core 不正なメモリ参照
+SIGPIPE 13 Term パイプ破壊:
+ 読み手の無いパイプへの書き出し
+SIGALRM 14 Term \fBalarm\fP(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 端末より入力された一時停止 (stop)
+SIGTTIN 21,21,26 Stop バックグランドプロセスの端末入力
+SIGTTOU 22,22,27 Stop バックグランドプロセスの端末出力
+.TE
+
+シグナル \fBSIGKILL\fP と \fBSIGSTOP\fP はキャッチ、ブロック、無視できない。
+
+次に、 POSIX.1\-1990 標準にはないが、 SUSv2 と POSIX.1\-2001 に記述されているシグナルを示す。
+.TS
+l c c l
+____
+lB c c l.
+シグナル 値 動作 コメント
+SIGBUS 10,7,10 Core バスエラー (不正なメモリアクセス)
+SIGPOLL Term ポーリング可能なイベント (Sys V)。
+ \fBSIGIO\fP と同義
+SIGPROF 27,27,29 Term profiling タイマの時間切れ
+SIGSYS 12,31,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)
+.TE
+
+Linux 2.2 以前では、 \fBSIGSYS\fP, \fBSIGXCPU\fP, \fBSIGXFSZ\fP および SPARC と MIPS
+以外のアーキテクチャでの \fBSIGBUS\fP のデフォルトの振る舞いは (コアダンプ出力なしの) プロセス終了であった。 (他の UNIX システムにも
+\fBSIGXCPU\fP と \fBSIGXFSZ\fP のデフォルトの動作がコアダンプなしのプロセス終了のものがある。) Linux 2.4
+では、POSIX.1\-2001 での要求仕様に準拠して、 これらのシグナルで、プロセスを終了させ、コアダンプを出力する ようになっている。
+
+次にその他の各種シグナルを示す。
+.TS
+l c c l
+____
+lB c c l.
+シグナル 値 動作 コメント
+SIGIOT 6 Core IOT トラップ。\fBSIGABRT\fP と同義
+SIGEMT 7,\-,7 Term
+SIGSTKFLT \-,16,\- A 数値演算プロセッサにおけるスタックフォルト (未使用)
+SIGIO 23,29,22 Term 入出力が可能になった (4.2BSD)
+SIGCLD \-,\-,18 Ign \fBSIGCHLD\fP と同義
+SIGPWR 29,30,19 Term 電源喪失 (Power failure) (System V)
+SIGINFO 29,\-,\- \fBSIGPWR\fP と同義
+SIGLOST \-,\-,\- Term ファイルロックが失われた (未使用)
+SIGWINCH 28,28,20 Ign ウィンドウ リサイズ シグナル (4.3BSD, Sun)
+SIGUNUSED \-,31,\- Core \fBSIGSYS\fP と同義
+.TE
+
+(シグナル 29 は alpha では \fBSIGINFO\fP / \fBSIGPWR\fP だが、sparc では \fBSIGLOST\fP である。)
+
+\fBSIGEMT\fP は POSIX.1\-2001 に規定されていないが、 その他の多くの UNIX システムに存在する。
+デフォルトの動作は多くの場合、コアダンプ出力を伴うプロセスの終了である。
+
+\fBSIGPWR\fP は (POSIX.1\-2001 に規定されていないが) このシグナルが存在する 他の UNIX
+システムでは多くの場合、デフォルト動作は無視である。
+
+\fBSIGIO\fP は (POSIX.1\-2001 に規定されていないが) いくつかの他の UNIX システムでは デフォルト動作は無視である。
+
+.\" parisc is the only exception: SIGSYS is 12, SIGUNUSED is 31
+\fBSIGUNUSED\fP が定義されている場合には、ほとんどのアーキテクチャで \fBSIGSYS\fP の同義語となっている。
+.SS リアルタイムシグナル
+Linux はリアルタイムシグナルをサポートしている。 リアルタイムシグナルは元々 POSIX.1b のリアルタイム拡張で定義されて
+いるものであり、現在では POSIX.1\-2001 に含まれている。 対応しているリアルタイムシグナルの範囲は、マクロ \fBSIGRTMIN\fP と
+\fBSIGRTMAX\fP で定義される。 POSIX.1\-2001 では、少なくとも \fB_POSIX_RTSIG_MAX\fP (8)
+個のリアルタイムシグナルに対応した実装が要求されている。
+.PP
+Linux は、32 個の異なるリアルタイムシグナルに対応しており、 その番号は 33 から 64 である。 しかしながら、glibc の POSIX
+スレッド実装は、 内部で 2個 (NPTL の場合) か 3個 (LinuxThreads の場合) の リアルタイムシグナルを使用しており
+(\fBpthreads\fP(7) 参照)、 \fBSIGRTMIN\fP の値を適切に (34 か 35 に) 調整する。
+利用可能なリアルタイムシグナルの範囲は glibc のスレッド実装により 異なるし (使用するカーネルと glibc により実行時にも変化する)、
+UNIX システムの種類によっても異なる。したがって、 プログラムでは「ハードコーディングした数字を使ってのリアルタイムシグナルの
+参照は決してすべきではなく」、代わりに \fBSIGRTMIN\fP+n の形で参照すべきである。また、 \fBSIGRTMIN\fP+n が
+\fBSIGRTMAX\fP を超えていないかのチェックを (実行時に) 適切に行うべきである。
+.PP
+標準シグナルと異なり、リアルタイムシグナルには 事前に定義された意味はない。 リアルタイムシグナルの全部をアプリケーションで定義した用途に使える。
+.PP
+ハンドリングしないリアルタイムシグナルのデフォルトの動作は 受信したプロセスの終了である。
+.PP
+リアルタイムシグナルは以下の特徴がある:
+.IP 1. 4
+リアルタイムシグナルは複数の実体をキューに入れることができる。 一方、標準シグナルの場合、そのシグナルがブロックされている間に
+同じシグナルの複数のインスタンスが配送されても、 1 つだけがキューに入れられる。
+.IP 2. 4
+シグナルが \fBsigqueue\fP(3) を用いて送信された場合、 付属データ (整数かポインタ) をシグナルと共に送信できる。 受信側プロセスが
+\fBsigaction\fP(2) に \fBSA_SIGINFO\fP フラグを指定してシグナルハンドラを設定した場合、 このデータは
+\fIsiginfo_t\fP 構造体の \fIsi_value\fP フィールド経由でハンドラの第 2 引き数として渡され、 利用することができる。
+さらに、この構造体の \fIsi_pid\fP と \fIsi_uid\fP フィールドでシグナルを送信したプロセスの PID と実ユーザ ID を
+得ることができる。
+.IP 3. 4
+リアルタイムシグナルでは配送される順序が保証される。 同じタイプのリアルタイムシグナルは送信された順番に到着する。
+異なるリアルタイムシグナルが一つのプロセスに送信された場合、 番号の小さいシグナルから先に到着する。
+(つまり小さい番号のシグナルが高い優先順位を持つ。) 対照的に、一つのプロセスに対して複数の標準シグナルが処理待ちとなった場合、
+これらのシグナルが配送される順序は不定である。
+.PP
+一つのプロセスに対して標準シグナルとリアルタイムシグナルの両方が 処理待ちの場合、POSIX はどちらが先に配送されるかを規定していない。 Linux
+では、他の多くの実装と同様、このような場合には 標準シグナルが優先される。
+.PP
+POSIX によれば、1 プロセス毎に最低 \fB_POSIX_SIGQUEUE_MAX\fP (32)
+個のリアルタイムシグナルをキューに入れられるべきとしている。 しかし、 Linux では違った実装になっている。カーネル 2.6.7 までは
+(2.6.7 を含む)、全プロセスでキューに入っているリアルタイムシグナル の数の合計についてシステム全体での制限がある。 この制限は
+\fI/proc/sys/kernel/rtsig\-max\fP ファイルで見ることができ、 (権限があれば) 変更もできる。 関係するファイルとして、
+\fI/proc/sys/kernel/rtsig\-nr\fP を見ることで、いくつのリアルタイムシグナルが現在キューに入っているかを 知ることができる。
+Linux 2.6.8 で、これらの \fI/proc\fP 経由のインターフェースは、 \fBRLIMIT_SIGPENDING\fP
+リソース制限に置き換えられた。 これは、キューに入るシグナル数に関してユーザ単位に 上限を指定するものである。 詳しくは \fBsetrlimit\fP(2)
+を参照。
+.SS "非同期シグナルで安全な関数 (async\-signal\-safe functions)"
+.PP
+シグナルハンドラ関数には非常に注意しなければならない。 他の場所の処理はプログラム実行の任意の箇所で中断される可能性があるためである。 POSIX
+には「安全な関数 (safe function)」という概念がある。 シグナルが安全でない関数の実行を中断し、かつ \fIhandler\fP
+が安全でない関数を呼び出した場合、プログラムの挙動は未定義である。
+
+POSIX.1\-2004 (POSIX.1\-2001 Technical Corrigendum (正誤表) 2 とも言う) では、
+シグナルハンドラ内での安全な呼び出しを保証することが必須の関数として 以下が規定されている。
+
+.in +4
+.nf
+_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()
+sockatmark()
+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()
+.fi
+.in
+.PP
+POSIX.1\-2008 では、上記のリストのうち fpathconf(), pathconf(), sysconf()
+が削除され、以下の関数が追加された。
+.PP
+.in +4n
+.nf
+execl()
+execv()
+faccessat()
+fchmodat()
+fchownat()
+fexecve()
+fstatat()
+futimens()
+linkat()
+mkdirat()
+mkfifoat()
+mknod()
+mknodat()
+openat()
+readlinkat()
+renameat()
+symlinkat()
+unlinkat()
+utimensat()
+utimes()
+.fi
+.in
+.SS シグナルハンドラによるシステムコールやライブラリ関数への割り込み
+システムコールやライブラリが停止 (block) している間にシグナルハンドラが 起動されると、以下のどちらかとなる。
+.IP * 2
+シグナルが返った後、呼び出しは自動的に再スタートされる。
+.IP *
+呼び出しはエラー \fBEINTR\fP で失敗する。
+.PP
+これらの二つの挙動のうちどちらが起こるかは、インターフェイスにより依存し、 シグナルハンドラが \fBSA_RESTART\fP フラグ
+(\fBsigaction\fP(2) 参照) を使って設定されていたかにも依存する。 詳細は UNIX システムによって異なる。 Linux
+における詳細を以下で説明する。
+
+.\" The following system calls use ERESTARTSYS,
+.\" so that they are restartable
+以下のインターフェイスのいずれかの呼び出しが停止している間に シグナルハンドラにより割り込まれた場合、 \fBSA_RESTART\fP
+フラグが使用されていれば、シグナルハンドラが返った後に その呼び出しは自動的に再スタートされることになる。 それ以外の場合は、その呼び出しはエラー
+\fBEINTR\fP で失敗することになる。
+.RS 4
+.IP * 2
+\fBread\fP(2), \fBreadv\fP(2), \fBwrite\fP(2), \fBwritev\fP(2), \fBioctl\fP(2) の「遅い
+(slow)」デバイスに対する呼び出し。 ここでいう「遅い」デバイスとは、I/O 呼び出しが無期限に停止 (block) する
+可能性のあるデバイスのことで、例としては端末、パイプ、ソケットがある (この定義では、ディスクは遅いデバイスではない)。 遅いデバイスに対する I/O
+呼び出しが、 シグナルハンドラにより割り込まれた時点までに何らかのデータを すでに転送していれば、呼び出しは成功ステータス
+(通常は、転送されたバイト数) を返すことだろう。
+.IP *
+停止 (block) する可能性のある \fBopen\fP(2) (例えば、FIFO のオープン時; \fBfifo\fP(7) 参照)。
+.IP *
+\fBwait\fP(2), \fBwait3\fP(2), \fBwait4\fP(2), \fBwaitid\fP(2), \fBwaitpid\fP(2).
+.IP *
+.\" If a timeout (setsockopt()) is in effect on the socket, then these
+.\" system calls switch to using EINTR. Consequently, they and are not
+.\" automatically restarted, and they show the stop/cont behavior
+.\" described below. (Verified from 2.6.26 source, and by experiment; mtk)
+ソケットインターフェイス: \fBaccept\fP(2), \fBconnect\fP(2), \fBrecv\fP(2), \fBrecvfrom\fP(2),
+\fBrecvmsg\fP(2), \fBsend\fP(2), \fBsendto\fP(2), \fBsendmsg\fP(2).
+但し、ソケットにタイムアウトが設定されていない場合 (下記参照)。
+.IP *
+ファイルロック用インターフェイス: \fBflock\fP(2), \fBfcntl\fP(2) \fBF_SETLKW\fP.
+.IP *
+POSIX メッセージキューインターフェイス: \fBmq_receive\fP(3), \fBmq_timedreceive\fP(3),
+\fBmq_send\fP(3), \fBmq_timedsend\fP(3).
+.IP *
+\fBfutex\fP(2) \fBFUTEX_WAIT\fP (Linux 2.6.22 以降; それ以前は常に \fBEINTR\fP で失敗していた)。
+.IP *
+POSIX セマフォインターフェイス: \fBsem_wait\fP(3), \fBsem_timedwait\fP(3) (Linux 2.6.22 以降;
+それ以前は常に \fBEINTR\fP で失敗していた)。
+.RE
+.PP
+.\" These are the system calls that give EINTR or ERESTARTNOHAND
+.\" on interruption by a signal handler.
+以下のインターフェイスは、 \fBSA_RESTART\fP を使っているどうかに関わらず、シグナルハンドラにより割り込まれた後、
+再スタートすることは決してない。 これらは、シグナルハンドラにより割り込まれると、常にエラー \fBEINTR\fP で失敗する。
+.RS 4
+.IP * 2
+\fBsetsockopt\fP(2) を使ってタイムアウトが設定されているソケットインターフェース: \fBaccept\fP(2), \fBrecv\fP(2),
+\fBrecvfrom\fP(2), \fBrecvmsg\fP(2) で受信タイムアウト (\fBSO_RCVTIMEO\fP) が設定されている場合と、
+\fBconnect\fP(2), \fBsend\fP(2), \fBsendto\fP(2), \fBsendmsg\fP(2) で送信タイムアウト
+(\fBSO_SNDTIMEO\fP) が設定されている場合。
+.IP *
+シグナル待ちに使われるインターフェイス: \fBpause\fP(2), \fBsigsuspend\fP(2), \fBsigtimedwait\fP(2),
+\fBsigwaitinfo\fP(2).
+.IP *
+ファイルディスクリプタ多重インターフェイス: \fBepoll_wait\fP(2), \fBepoll_pwait\fP(2), \fBpoll\fP(2),
+\fBppoll\fP(2), \fBselect\fP(2), \fBpselect\fP(2).
+.IP *
+.\" On some other systems, SA_RESTART does restart these system calls
+System V IPC インターフェイス: \fBmsgrcv\fP(2), \fBmsgsnd\fP(2), \fBsemop\fP(2),
+\fBsemtimedop\fP(2).
+.IP *
+スリープ用のインターフェイス: \fBclock_nanosleep\fP(2), \fBnanosleep\fP(2), \fBusleep\fP(3).
+.IP *
+\fBinotify\fP(7) ファイルディスクリプタからの \fBread\fP(2).
+.IP *
+\fBio_getevents\fP(2).
+.RE
+.PP
+\fBsleep\fP(3) 関数も、ハンドラにより割り込まれた場合、決して再スタートされることはない。 しかし、成功となり、残っている停止時間を返す。
+.SS 一時停止シグナルによるシステムコールやライブラリ関数への割り込み
+Linux では、シグナルハンドラが設定されていない場合でも、 いくつかのブロッキング型のインターフェイスは、 プロセスが一時停止 (stop)
+シグナルの一つにより停止され、 \fBSIGCONT\fP により再開された後に、エラー \fBEINTR\fP で失敗する可能性がある。 この挙動は
+POSIX.1 で認められておらず、他のシステムでは起こらない。
+
+この挙動を示す Linux のインターフェイスは以下の通りである。
+.RS 4
+.IP * 2
+\fBsetsockopt\fP(2) を使ってタイムアウトが設定されているソケットインターフェース: \fBaccept\fP(2), \fBrecv\fP(2),
+\fBrecvfrom\fP(2), \fBrecvmsg\fP(2) で受信タイムアウト (\fBSO_RCVTIMEO\fP) が設定されている場合と、
+\fBconnect\fP(2), \fBsend\fP(2), \fBsendto\fP(2), \fBsendmsg\fP(2) で送信タイムアウト
+(\fBSO_SNDTIMEO\fP) が設定されている場合。
+.IP * 2
+\fBepoll_wait\fP(2), \fBepoll_pwait\fP(2).
+.IP *
+\fBsemop\fP(2), \fBsemtimedop\fP(2).
+.IP *
+\fBsigtimedwait\fP(2), \fBsigwaitinfo\fP(2).
+.IP *
+\fBinotify\fP(7) ファイルディスクリプタからの \fBread\fP(2).
+.IP *
+Linux 2.6.21 以前: \fBfutex\fP(2) \fBFUTEX_WAIT\fP, \fBsem_timedwait\fP(3),
+\fBsem_wait\fP(3).
+.IP *
+Linux 2.6.8 以前: \fBmsgrcv\fP(2), \fBmsgsnd\fP(2).
+.IP *
+Linux 2.4 以前: \fBnanosleep\fP(2).
+.RE
+.SH 準拠
+.\" It must be a *very* long time since this was true:
+.\" .SH BUGS
+.\" .B SIGIO
+.\" and
+.\" .B SIGLOST
+.\" have the same value.
+.\" The latter is commented out in the kernel source, but
+.\" the build process of some software still thinks that
+.\" signal 29 is
+.\" .BR SIGLOST .
+POSIX.1 (注記した内容以外)。
+.SH 関連項目
+\fBkill\fP(1), \fBgetrlimit\fP(2), \fBkill\fP(2), \fBkillpg\fP(2),
+\fBrt_sigqueueinfo\fP(2), \fBsetitimer\fP(2), \fBsetrlimit\fP(2), \fBsgetmask\fP(2),
+\fBsigaction\fP(2), \fBsigaltstack\fP(2), \fBsignal\fP(2), \fBsignalfd\fP(2),
+\fBsigpending\fP(2), \fBsigprocmask\fP(2), \fBsigsuspend\fP(2), \fBsigwaitinfo\fP(2),
+\fBabort\fP(3), \fBbsd_signal\fP(3), \fBlongjmp\fP(3), \fBraise\fP(3),
+\fBpthread_sigqueue\fP(3), \fBsigqueue\fP(3), \fBsigset\fP(3), \fBsigsetops\fP(3),
+\fBsigvec\fP(3), \fBsigwait\fP(3), \fBstrsignal\fP(3), \fBsysv_signal\fP(3), \fBcore\fP(5),
+\fBproc\fP(5), \fBpthreads\fP(7), \fBsigevent\fP(7)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.50 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。