OSDN Git Service

Convert release and draft pages to UTF-8.
[linuxjm/jm.git] / manual / LDP_man-pages / release / man7 / signal.7
1 '\" t
2 .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
3 .\" and Copyright (c) 2002, 2006 by Michael Kerrisk <mtk.manpages@gmail.com>
4 .\" and Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk
5 .\"     <mtk.manpages@gmail.com>
6 .\"
7 .\" Permission is granted to make and distribute verbatim copies of this
8 .\" manual provided the copyright notice and this permission notice are
9 .\" preserved on all copies.
10 .\"
11 .\" Permission is granted to copy and distribute modified versions of this
12 .\" manual under the conditions for verbatim copying, provided that the
13 .\" entire resulting derived work is distributed under the terms of a
14 .\" permission notice identical to this one.
15 .\"
16 .\" Since the Linux kernel and libraries are constantly changing, this
17 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
18 .\" responsibility for errors or omissions, or for damages resulting from
19 .\" the use of the information contained herein.  The author(s) may not
20 .\" have taken the same level of care in the production of this manual,
21 .\" which is licensed free of charge, as they might when working
22 .\" professionally.
23 .\"
24 .\" Formatted or processed versions of this manual, if unaccompanied by
25 .\" the source, must acknowledge the copyright and authors of this work.
26 .\"
27 .\" Modified Sat Jul 24 17:34:08 1993 by Rik Faith (faith@cs.unc.edu)
28 .\" Modified Sun Jan  7 01:41:27 1996 by Andries Brouwer (aeb@cwi.nl)
29 .\" Modified Sun Apr 14 12:02:29 1996 by Andries Brouwer (aeb@cwi.nl)
30 .\" Modified Sat Nov 13 16:28:23 1999 by Andries Brouwer (aeb@cwi.nl)
31 .\" Modified 10 Apr 2002, by Michael Kerrisk <mtk.manpages@gmail.com>
32 .\" Modified  7 Jun 2002, by Michael Kerrisk <mtk.manpages@gmail.com>
33 .\"     Added information on real-time signals
34 .\" Modified 13 Jun 2002, by Michael Kerrisk <mtk.manpages@gmail.com>
35 .\"     Noted that SIGSTKFLT is in fact unused
36 .\" 2004-12-03, Modified mtk, added notes on RLIMIT_SIGPENDING
37 .\" 2006-04-24, mtk, Added text on changing signal dispositions,
38 .\"             signal mask, and pending signals.
39 .\" 2008-07-04, mtk:
40 .\"     Added section on system call restarting (SA_RESTART)
41 .\"     Added section on stop/cont signals interrupting syscalls.
42 .\" 2008-10-05, mtk: various additions
43 .\"
44 .\" Japanese Version Copyright (c) 1997 Takafumi Naka
45 .\"     and 2005-2008 Akihiro MOTOKI
46 .\"         all rights reserved.
47 .\" Translated 1997-02-13, Takafumi Naka <takafumi@yk.rim.or.jp>
48 .\" Modified 1999-06-22, Tatsuo SEKINE <tsekine@isoternet.org>
49 .\" Modified 1999-07-18, Takafumi Naka <takafumi@yk.rim.or.jp>
50 .\" Modified 1999-12-06, NAKANO Takeo <nakano@apm.seikei.ac.jp>, LDP v1.28
51 .\" Updated 2003-07-24, Kentaro Shirakata <argrath@ub32.org>
52 .\" Updated 2005-02-23, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
53 .\" Updated 2006-07-28, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.36
54 .\" Updated 2007-05-28, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.50
55 .\" Updated 2007-09-08, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.64
56 .\" Updated 2008-08-11, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.05
57 .\" Updated 2008-11-21, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.13
58 .\" Updated 2010-04-10, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.24
59 .\"
60 .\"WORD:        disposition     処理方法
61 .\"WORD:        pending         処理待ち
62 .\"WORD:        signal handler  シグナルハンドラ
63 .\"
64 .TH SIGNAL 7  2011-09-18 "Linux" "Linux Programmer's Manual"
65 .SH 名前
66 signal \- シグナルの概要
67 .SH 説明
68 Linux は POSIX 信頼シグナル (reliable signal; 以後 "標準シグナル"と表記)
69 と POSIX リアルタイムシグナルの両方に対応している。
70 .SS シグナル処理方法
71 シグナルはそれぞれ現在の「処理方法 (disposition)」を保持しており、
72 この処理方法によりシグナルが配送された際にプロセスが
73 どのような振舞いをするかが決まる。
74
75 後述の表の "動作" の欄のエントリは各シグナルのデフォルトの
76 処理方法を示しており、以下のような意味を持つ。
77 .IP Term
78 デフォルトの動作はプロセス終了。
79 .IP Ign
80 デフォルトの動作はこのシグナルの無視。
81 .IP Core
82 デフォルトの動作はプロセス終了とコアダンプ出力
83 .RB ( core (5)
84 参照)。
85 .IP Stop
86 デフォルトの動作はプロセスの一時停止。
87 .IP Cont
88 デフォルトの動作は、プロセスが停止中の場合にその実行の再開。
89 .PP
90 プロセスは、
91 .BR sigaction (2)
92
93 .BR signal (2)
94 を使って、シグナルの処理方法を変更することができる
95 .RB ( signal (2)
96 の方がシグナルハンドラを設定する際の移植性が低い;
97 詳細は
98 .BR signal (2)
99 を参照)。
100 シグナルの配送時に起こる動作として
101 プロセスが選択できるのは、次のいずれか一つである。
102 デフォルトの動作を実行する、シグナルを無視する、
103 .I "シグナルハンドラ (signal handler)"
104 でシグナルを捕捉する。シグナルハンドラとは、シグナル配送時に
105 自動的に起動されるプログラマ定義の関数である。
106 (デフォルトでは、シグナルハンドラは通常のプロセスのスタック上で起動される。
107 シグナルハンドラが代替スタック (alternate stack) を使用するように設定する
108 こともできる。代替スタックを使用するように設定する方法と、どのような際に
109 代替スタックが役に立つかについての議論については
110 .BR sigaltstack (2)
111 を参照のこと。
112
113 シグナルの処理方法はプロセス単位の属性である。
114 マルチスレッドのアプリケーションでは、あるシグナルの処理方法は
115 全てのスレッドで同じである。
116
117 .BR fork (2)
118 で作成された子プロセスは親プロセスのシグナルの処理方法のコピーを継承する。
119 .BR execve (2)
120 の間、ハンドラが登録されているシグナルの処理方法はデフォルトにリセット
121 され、無視となっているシグナルの処理方法は変更されずそのままとなる。
122 .SS シグナルの送信
123 以下のシステムコールとライブラリ関数を使って、
124 呼び出し者はシグナルを送信することができる。
125 .TP 16
126 .BR raise (3)
127 呼び出したスレッドにシグナルを送る。
128 .TP
129 .BR kill (2)
130 指定されたプロセスや、指定されたプロセスグループの全メンバー、
131 システムの全プロセスにシグナルを送る。
132 .TP
133 .BR killpg (2)
134 指定されたプロセスグループの全メンバーにシグナルを送る。
135 .TP
136 .BR pthread_kill (3)
137 呼び出し者と同じプロセス内の指定された POSIX スレッドにシグナルを送る。
138 .TP
139 .BR tgkill (2)
140 指定されたプロセス内の指定されたスレッドにシグナルを送る
141 (このシステムコールを使って
142 .BR pthread_kill (3)
143 は実装されている)。
144 .TP
145 .BR sigqueue (3)
146 指定されたプロセスに付属データとともにリアルタイムシグナルを送る。
147 .SS シグナルが捕捉されるのを待つ
148 以下のシステムコールを使って、シグナルが捕捉されるまで
149 呼び出したプロセスやスレッドの実行を中断 (suspend) することができる
150 (ハンドラが設定されていないシグナルによりそのプロセスが終了した
151 場合にも実行の停止は終了する)。
152 .TP 16
153 .BR pause (2)
154 何かシグナルが捕捉されるまで実行を停止する。
155 .TP
156 .BR sigsuspend (2)
157 一時的にシグナルマスク (下記参照) を変更し、
158 マスクされていないシグナルのいずれかが捕捉されるまで
159 実行を中断する。
160 .SS シグナルの同期受信
161 シグナルハンドラ経由でシグナルを非同期 (asynchronously) で捕捉する以外にも、
162 シグナルを同期 (synchronously) して受け付けることもできる。
163 同期して受け付けるとは、シグナルが配送されるまで実行を停止 (block)
164 するということである。シグナルを受け付けた際に、カーネルは
165 そのシグナルに関する情報を呼び出し者に返す。
166 これを行う一般的な方法が二つある。
167 .IP * 2
168 .BR sigwaitinfo (2),
169 .BR sigtimedwait (2),
170 .BR sigwait (3)
171 は、指定されたシグナル集合のシグナルの一つが配送されるまで実行を中断する。
172 どのシステムコールや関数でも、配送されたシグナルに関する情報が返される。
173 .IP *
174 .BR signalfd (2)
175 が返すファイルディスクリプタを使うと、呼び出し元に配送された
176 シグナルに関する情報を読み出すことができる。
177 このファイルディスクリプタからの
178 .BR read (2)
179 は、
180 .BR signalfd (2)
181 の呼び出し時に指定されたシグナル集合のシグナルの一つが呼び出し元に
182 配送されるまで停止 (block) する。
183 .BR read (2)
184 が返すバッファにはシグナルに関する情報を格納した構造体が入っている。
185 .SS シグナルマスクと処理待ちシグナル
186 シグナルは
187 .I "ブロック (block)"
188 されることがある。ブロックされると、そのシグナルは
189 その後ブロックを解除されるまで配送されなくなる。
190 シグナルが生成されてから配送されるまでの間、そのシグナルは
191 .I "処理待ち (pending)"
192 であると呼ばれる。
193
194 プロセス内の各スレッドは、それぞれ独立な
195 .I "シグナルマスク (signal mask)"
196 を持つ。シグナルマスクはそのスレッドが現在ブロックしている
197 シグナル集合を示すものである。
198 スレッドは、
199 .BR pthread_sigmask (3)
200 を使って自分のシグナルマスクを操作できる。
201 伝統的なシングルスレッドのアプリケーションでは、
202 .BR sigprocmask (2)
203 を使って、シグナルマスクを操作できる。
204
205 .BR fork (2)
206 経由で作成された子プロセスは、
207 親プロセスのシグナルマスクのコピーを継承する。
208 .BR execve (2)
209 の前後でシグナルマスクは保持される。
210
211 生成されるシグナル (したがって処理待ちとなるシグナル) には、
212 プロセス全体宛てと特定のスレッド宛てがある。
213 例えば、プロセス全体宛てのシグナルは
214 .BR kill (2)
215 を使って送信される。
216 特定のマシン語の命令の実行の結果として生成される、
217 .B SIGSEGV
218
219 .B SIGFPE
220 などのシグナルは、スレッド宛てとなる。
221 また、
222 .BR pthread_kill (3)
223 を使って特定のスレッド宛てに生成されたシグナルも
224 スレッド宛てとなる。
225 プロセス宛てのシグナルは、そのシグナルをブロックしていないスレッドのうち
226 いずれかの一つに配送することができる。そのシグナルをブロックしていない
227 スレッドが複数ある場合、シグナルを配送するスレッドはカーネルが
228 無作為に選択する。
229
230 スレッドは、
231 .BR sigpending (2)
232 を使って、現在処理待ちのシグナル集合を取得することができる。
233 この集合は、プロセス宛ての処理待ちシグナルと
234 呼び出したスレッド宛てのシグナルの両方から構成される。
235
236 .BR fork (2)
237 経由で作成された子プロセスでは、処理待ちのシグナル集合は
238 空の集合で初期化される。
239 .BR execve (2)
240 の前後で、処理待ちのシグナル集合は保持される。
241 .SS 標準シグナル
242 Linux は以下に示す標準シグナルに対応している。
243 シグナル番号の一部はアーキテクチャ依存であり、"値" 欄に示す通りである。
244 (3つの値が書かれているものは、 1つ目が alpha と sparc で通常有効な値、
245 真ん中が ix86, ia64, ppc, s390, arm, sh での値、最後が mips での値である。
246 .\" parisc is a law unto itself
247 \- はそのアーキテクチャにおいて対応するシグナルがないことを示す。)
248
249 最初に、POSIX.1-1990 に定義されているシグナルを示す。
250 .TS
251 l c c l
252 ____
253 lB c c l.
254 シグナル    値     動作  コメント
255 SIGHUP  \01     Term    T{
256 制御端末(controlling terminal)のハングアップ検出、
257 または制御しているプロセスの死
258 T}
259 SIGINT  \02     Term    キーボードからの割り込み (Interrupt)
260 SIGQUIT \03     Core    キーボードによる中止 (Quit)
261 SIGILL  \04     Core    不正な命令
262 SIGABRT \06     Core    \fBabort\fP(3) からの中断 (Abort) シグナル
263 SIGFPE  \08     Core    浮動小数点例外
264 SIGKILL \09     Term    Kill シグナル
265 SIGSEGV 11      Core    不正なメモリ参照
266 SIGPIPE 13      Term    パイプ破壊: 読み手の無いパイプへの書き出し
267 SIGALRM 14      Term    \fBalarm\fP(2) からのタイマーシグナル
268 SIGTERM 15      Term    終了 (termination) シグナル
269 SIGUSR1 30,10,16        Term    ユーザ定義シグナル 1
270 SIGUSR2 31,12,17        Term    ユーザ定義シグナル 2
271 SIGCHLD 20,17,18        Ign     子プロセスの一時停止 (stop) または終了
272 SIGCONT 19,18,25        Cont    一時停止 (stop) からの再開
273 SIGSTOP 17,19,23        Stop    プロセスの一時停止 (stop)
274 SIGTSTP 18,20,24        Stop    端末 (tty) より入力された一時停止 (stop)
275 SIGTTIN 21,21,26        Stop    バックグランドプロセスの tty 入力
276 SIGTTOU 22,22,27        Stop    バックグランドプロセスの tty 出力
277 .TE
278
279 シグナル
280 .B SIGKILL
281
282 .B SIGSTOP
283 はキャッチ、ブロック、無視できない。
284
285 次に、 POSIX.1-1990 標準にはないが、 SUSv2 と
286 POSIX.1-2001 に記述されているシグナルを示す。
287 .TS
288 l c c l
289 ____
290 lB c c l.
291 シグナル    値     動作  コメント
292 SIGBUS  10,7,10 Core    バスエラー (不正なメモリアクセス)
293 SIGPOLL         Term    ポーリング可能なイベント (Sys V)。
294                         \fBSIGIO\fP と同義
295 SIGPROF 27,27,29        Term    profiling タイマの時間切れ
296 SIGSYS  12,31,12        Core    ルーチンへの引き数が不正 (SVr4)
297 SIGTRAP 5       Core    トレース/ブレークポイント トラップ
298 SIGURG  16,23,21        Ign     T{
299 ソケットの緊急事態 (urgent condition) (4.2BSD)
300 T}
301 SIGVTALRM       26,26,28        Term    仮想アラームクロック (4.2BSD)
302 SIGXCPU 24,24,30        Core    CPU時間制限超過 (4.2BSD)
303 SIGXFSZ 25,25,31        Core    ファイルサイズ制限の超過 (4.2BSD)
304 .TE
305
306 Linux 2.2 以前では、
307 .BR SIGSYS ", " SIGXCPU ", " SIGXFSZ
308 および SPARC と MIPS 以外のアーキテクチャでの
309 .B SIGBUS
310 のデフォルトの振る舞いは (コアダンプ出力なしの) プロセス終了であった。
311 (他の UNIX システムにも
312 .BR SIGXCPU " と " SIGXFSZ
313 のデフォルトの動作がコアダンプなしのプロセス終了のものがある。)
314 Linux 2.4 では、POSIX.1-2001 での要求仕様に準拠して、
315 これらのシグナルで、プロセスを終了させ、コアダンプを出力する
316 ようになっている。
317
318 次にその他の各種シグナルを示す。
319 .TS
320 l c c l
321 ____
322 lB c c l.
323 シグナル    値     動作  コメント
324 SIGIOT  6       Core    IOT トラップ。\fBSIGABRT\fP と同義
325 SIGEMT  7,\-,7  Term
326 SIGSTKFLT       \-,16,\-        A       T{
327 数値演算プロセッサにおけるスタックフォルト (未使用)
328 T}
329 SIGIO   23,29,22        Term    入出力が可能になった (4.2BSD)
330 SIGCLD  \-,\-,18        Ign     \fBSIGCHLD\fP と同義
331 SIGPWR  29,30,19        Term    電源喪失 (Power failure) (System V)
332 SIGINFO 29,\-,\-                \fBSIGPWR\fP と同義
333 SIGLOST \-,\-,\-        Term    ファイルロックが失われた
334 SIGWINCH        28,28,20        Ign     T{
335 ウィンドウ リサイズ シグナル (4.3BSD, Sun)
336 T}
337 SIGUNUSED       \-,31,\-        Core    \fBSIGSYS\fP と同義
338 .TE
339
340 (シグナル 29 は alpha では
341 .B SIGINFO
342 /
343 .B SIGPWR
344 だが、sparc では
345 .B SIGLOST
346 である。)
347
348 .B SIGEMT
349 は POSIX.1-2001 に規定されていないが、
350 その他の多くの UNIX システムに存在する。
351 デフォルトの動作は多くの場合、コアダンプ出力を伴うプロセスの終了である。
352
353 .B SIGPWR
354 は (POSIX.1-2001 に規定されていないが) このシグナルが存在する
355 他の UNIX システムでは多くの場合、デフォルト動作は無視である。
356
357 .B SIGIO
358 は (POSIX.1-2001 に規定されていないが) いくつかの他の UNIX システムでは
359 デフォルト動作は無視である。
360
361 .B SIGUNUSED
362 が定義されている場合には、ほとんどのアーキテクチャで
363 .B SIGSYS
364 の同義語となっている。
365 .\" parisc is the only exception: SIGSYS is 12, SIGUNUSED is 31
366 .SS リアルタイムシグナル
367 Linux はリアルタイムシグナルをサポートしている。
368 リアルタイムシグナルは元々 POSIX.1b のリアルタイム拡張で定義されて
369 いるものであり、現在では POSIX.1-2001 に含まれている。
370 対応しているリアルタイムシグナルの範囲は、マクロ
371 .B SIGRTMIN
372
373 .B SIGRTMAX
374 で定義される。
375 POSIX.1-2001 では、少なくとも
376 .B _POSIX_RTSIG_MAX
377 (8) 個のリアルタイムシグナルに対応した実装が要求されている。
378 .PP
379 Linux は、32 個の異なるリアルタイムシグナルに対応しており、
380 その番号は 33 から 64 である。
381 しかしながら、glibc の POSIX スレッド実装は、
382 内部で 2個 (NPTL の場合) か 3個 (LinuxThreads の場合) の
383 リアルタイムシグナルを使用しており
384 .RB ( pthreads (7)
385 参照)、
386 .B SIGRTMIN
387 の値を適切に (34 か 35 に) 調整する。
388 利用可能なリアルタイムシグナルの範囲は glibc のスレッド実装により
389 異なるし (使用するカーネルと glibc により実行時にも変化する)、
390 UNIX システムの種類によっても異なる。したがって、
391 プログラムでは「ハードコーディングした数字を使ってのリアルタイムシグナルの
392 参照は決してすべきではなく」、代わりに
393 .BR SIGRTMIN +n
394 の形で参照すべきである。また、
395 .BR SIGRTMIN +n
396
397 .B SIGRTMAX
398 を超えていないかのチェックを (実行時に) 適切に行うべきである。
399 .PP
400 標準シグナルと異なり、リアルタイムシグナルには
401 事前に定義された意味はない。
402 リアルタイムシグナルの全部をアプリケーションで定義した用途に使える。
403 .PP
404 ハンドリングしないリアルタイムシグナルのデフォルトの動作は
405 受信したプロセスの終了である。
406 .PP
407 リアルタイムシグナルは以下の特徴がある:
408 .IP 1. 4
409 リアルタイムシグナルは複数の実体をキューに入れることができる。
410 一方、標準シグナルの場合、そのシグナルがブロックされている間に
411 同じシグナルの複数のインスタンスが配送されても、
412 1 つだけがキューに入れられる。
413 .IP 2. 4
414 シグナルが
415 .BR sigqueue (3)
416 を用いて送信された場合、
417 付属データ (整数かポインタ) をシグナルと共に送信できる。
418 受信側プロセスが
419 .BR sigaction (2)
420
421 .B SA_SIGINFO
422 フラグを指定してシグナルハンドラを設定した場合、
423 このデータは
424 .I siginfo_t
425 構造体の
426 .I si_value
427 フィールド経由でハンドラの第 2 引き数として渡され、
428 利用することができる。
429 さらに、この構造体の
430 .I si_pid
431
432 .I si_uid
433 フィールドでシグナルを送信したプロセスの PID と実ユーザ ID を
434 得ることができる。
435 .IP 3. 4
436 リアルタイムシグナルでは配送される順序が保証される。
437 同じタイプのリアルタイムシグナルは送信された順番に到着する。
438 異なるリアルタイムシグナルが一つのプロセスに送信された場合、
439 番号の小さいシグナルから先に到着する。
440 (つまり小さい番号のシグナルが高い優先順位を持つ。)
441 対照的に、一つのプロセスに対して複数の標準シグナルが処理待ちとなった場合、
442 これらのシグナルが配送される順序は不定である。
443 .PP
444 一つのプロセスに対して標準シグナルとリアルタイムシグナルの両方が
445 処理待ちの場合、POSIX はどちらが先に配送されるかを規定していない。
446 Linux では、他の多くの実装と同様、このような場合には
447 標準シグナルが優先される。
448 .PP
449 POSIX によれば、1 プロセス毎に最低
450 .B _POSIX_SIGQUEUE_MAX
451 (32) 個のリアルタイムシグナルをキューに入れられるべきとしている。
452 しかし、 Linux では違った実装になっている。カーネル 2.6.7 までは
453 (2.6.7 を含む)、全プロセスでキューに入っているリアルタイムシグナル
454 の数の合計についてシステム全体での制限がある。
455 この制限は
456 .I /proc/sys/kernel/rtsig-max
457 ファイルで見ることができ、 (権限があれば) 変更もできる。
458 関係するファイルとして、
459 .I /proc/sys/kernel/rtsig-nr
460 を見ることで、いくつのリアルタイムシグナルが現在キューに入っているかを
461 知ることができる。
462 Linux 2.6.8 で、これらの
463 .I /proc
464 経由のインターフェースは、
465 .B RLIMIT_SIGPENDING
466 リソース制限に置き換えられた。
467 これは、キューに入るシグナル数に関してユーザ単位に
468 上限を指定するものである。
469 詳しくは
470 .BR setrlimit (2)
471 を参照。
472 .SS "非同期シグナルで安全な関数 (async-signal-safe functions)"
473 .PP
474 シグナルハンドラ関数には非常に注意しなければならない。
475 他の場所の処理はプログラム実行の任意の箇所で中断される可能性があるためである。
476 POSIX には「安全な関数 (safe function)」という概念がある。
477 シグナルが安全でない関数の実行を中断し、かつ
478 .I handler
479 が安全でない関数を呼び出した場合、プログラムの挙動は未定義である。
480
481 POSIX.1-2004 (POSIX.1-2001 Technical Corrigendum (正誤表) 2 とも言う) では、
482 シグナルハンドラ内での安全な呼び出しを保証することが必須の関数として
483 以下が規定されている。
484
485 .in +4
486 .nf
487 _Exit()
488 _exit()
489 abort()
490 accept()
491 access()
492 aio_error()
493 aio_return()
494 aio_suspend()
495 alarm()
496 bind()
497 cfgetispeed()
498 cfgetospeed()
499 cfsetispeed()
500 cfsetospeed()
501 chdir()
502 chmod()
503 chown()
504 clock_gettime()
505 close()
506 connect()
507 creat()
508 dup()
509 dup2()
510 execle()
511 execve()
512 fchmod()
513 fchown()
514 fcntl()
515 fdatasync()
516 fork()
517 fpathconf()
518 fstat()
519 fsync()
520 ftruncate()
521 getegid()
522 geteuid()
523 getgid()
524 getgroups()
525 getpeername()
526 getpgrp()
527 getpid()
528 getppid()
529 getsockname()
530 getsockopt()
531 getuid()
532 kill()
533 link()
534 listen()
535 lseek()
536 lstat()
537 mkdir()
538 mkfifo()
539 open()
540 pathconf()
541 pause()
542 pipe()
543 poll()
544 posix_trace_event()
545 pselect()
546 raise()
547 read()
548 readlink()
549 recv()
550 recvfrom()
551 recvmsg()
552 rename()
553 rmdir()
554 select()
555 sem_post()
556 send()
557 sendmsg()
558 sendto()
559 setgid()
560 setpgid()
561 setsid()
562 setsockopt()
563 setuid()
564 shutdown()
565 sigaction()
566 sigaddset()
567 sigdelset()
568 sigemptyset()
569 sigfillset()
570 sigismember()
571 signal()
572 sigpause()
573 sigpending()
574 sigprocmask()
575 sigqueue()
576 sigset()
577 sigsuspend()
578 sleep()
579 sockatmark()
580 socket()
581 socketpair()
582 stat()
583 symlink()
584 sysconf()
585 tcdrain()
586 tcflow()
587 tcflush()
588 tcgetattr()
589 tcgetpgrp()
590 tcsendbreak()
591 tcsetattr()
592 tcsetpgrp()
593 time()
594 timer_getoverrun()
595 timer_gettime()
596 timer_settime()
597 times()
598 umask()
599 uname()
600 unlink()
601 utime()
602 wait()
603 waitpid()
604 write()
605 .fi
606 .in
607 .PP
608 POSIX.1-2008 では、上記のリストのうち fpathconf(), pathconf(), sysconf()
609 が削除され、以下の関数が追加された。
610 .PP
611 .in +4n
612 .nf
613 execl()
614 execv()
615 faccessat()
616 fchmodat()
617 fchownat()
618 fexecve()
619 fstatat()
620 futimens()
621 linkat()
622 mkdirat()
623 mkfifoat()
624 mknod()
625 mknodat()
626 openat()
627 readlinkat()
628 renameat()
629 symlinkat()
630 unlinkat()
631 utimensat()
632 utimes()
633 .fi
634 .in
635 .SS シグナルハンドラによるシステムコールやライブラリ関数への割り込み
636 システムコールやライブラリが停止 (block) している間にシグナルハンドラが
637 起動されると、以下のどちらかとなる。
638 .IP * 2
639 シグナルが返った後、呼び出しは自動的に再スタートされる。
640 .IP *
641 呼び出しはエラー
642 .B EINTR
643 で失敗する。
644 .PP
645 これらの二つの挙動のうちどちらが起こるかは、インターフェイスにより依存し、
646 シグナルハンドラが
647 .B SA_RESTART
648 フラグ
649 .RB ( sigaction (2)
650 参照) を使って設定されていたかにも依存する。
651 詳細は UNIX システムによって異なる。
652 Linux における詳細を以下で説明する。
653
654 以下のインターフェイスのいずれかの呼び出しが停止している間に
655 シグナルハンドラにより割り込まれた場合、
656 .B SA_RESTART
657 フラグが使用されていれば、シグナルハンドラが返った後に
658 その呼び出しは自動的に再スタートされることになる。
659 それ以外の場合は、その呼び出しはエラー
660 .B EINTR
661 で失敗することになる。
662 .\" 以下のシステムコールは ERESTARTSYS を使っている。
663 .\" そのため、これらは再スタートが可能である。
664 .RS 4
665 .IP * 2
666 .BR read (2),
667 .BR readv (2),
668 .BR write (2),
669 .BR writev (2),
670 .BR ioctl (2)
671 の「遅い (slow)」デバイスに対する呼び出し。
672 ここでいう「遅い」デバイスとは、I/O 呼び出しが無期限に停止 (block) する
673 可能性のあるデバイスのことで、例としては端末、パイプ、ソケットがある
674 (この定義では、ディスクは遅いデバイスではない)。
675 遅いデバイスに対する I/O 呼び出しが、
676 シグナルハンドラにより割り込まれた時点までに何らかのデータを
677 すでに転送していれば、呼び出しは成功ステータス
678 (通常は、転送されたバイト数) を返すことだろう。
679 .IP *
680 停止 (block) する可能性のある
681 .BR open (2)
682 (例えば、FIFO のオープン時;
683 .BR fifo (7)
684 参照)。
685 .IP *
686 .BR wait (2),
687 .BR wait3 (2),
688 .BR wait4 (2),
689 .BR waitid (2),
690 .BR waitpid (2).
691 .IP *
692 ソケットインターフェイス:
693 .\" If a timeout (setsockopt()) is in effect on the socket, then these
694 .\" system calls switch to using EINTR.  Consequently, they and are not
695 .\" automatically restarted, and they show the stop/cont behavior
696 .\" described below.  (Verified from 2.6.26 source, and by experiment; mtk)
697 .BR accept (2),
698 .BR connect (2),
699 .BR recv (2),
700 .BR recvfrom (2),
701 .BR recvmsg (2),
702 .BR send (2),
703 .BR sendto (2),
704 .BR sendmsg (2).
705 但し、ソケットにタイムアウトが設定されていない場合 (下記参照)。
706 .IP *
707 ファイルロック用インターフェイス:
708 .BR flock (2),
709 .BR fcntl (2)
710 .BR F_SETLKW .
711 .IP *
712 POSIX メッセージキューインターフェイス:
713 .BR mq_receive (3),
714 .BR mq_timedreceive (3),
715 .BR mq_send (3),
716 .BR mq_timedsend (3).
717 .IP *
718 .BR futex (2)
719 .B FUTEX_WAIT
720 (Linux 2.6.22 以降; それ以前は常に
721 .B EINTR
722 で失敗していた)。
723 .IP *
724 POSIX セマフォインターフェイス:
725 .BR sem_wait (3),
726 .BR sem_timedwait (3)
727 (Linux 2.6.22 以降; それ以前は常に
728 .B EINTR
729 で失敗していた)。
730 .RE
731 .PP
732 以下のインターフェイスは、
733 .B SA_RESTART
734 を使っているどうかに関わらず、シグナルハンドラにより割り込まれた後、
735 再スタートすることは決してない。
736 これらは、シグナルハンドラにより割り込まれると、常にエラー
737 .B EINTR
738 で失敗する。
739 .\" これらは、シグナルハンドラによる割り込みの際に
740 .\" EINTR か ERESTARTNOHAND を返すシステムコールである。
741 .RS 4
742 .IP * 2
743 .BR setsockopt (2)
744 を使ってタイムアウトが設定されているソケットインターフェース:
745 .BR accept (2),
746 .BR recv (2),
747 .BR recvfrom (2),
748 .BR recvmsg (2)
749 で受信タイムアウト
750 .RB ( SO_RCVTIMEO )
751 が設定されている場合と、
752 .BR connect (2),
753 .BR send (2),
754 .BR sendto (2),
755 .BR sendmsg (2)
756 で送信タイムアウト
757 .RB ( SO_SNDTIMEO )
758 が設定されている場合。
759 .IP *
760 シグナル待ちに使われるインターフェイス:
761 .BR pause (2),
762 .BR sigsuspend (2),
763 .BR sigtimedwait (2),
764 .BR sigwaitinfo (2).
765 .IP *
766 ファイルディスクリプタ多重インターフェイス:
767 .BR epoll_wait (2),
768 .BR epoll_pwait (2),
769 .BR poll (2),
770 .BR ppoll (2),
771 .BR select (2),
772 .BR pselect (2).
773 .IP *
774 System V IPC インターフェイス:
775 .\" On some other systems, SA_RESTART does restart these system calls
776 .BR msgrcv (2),
777 .BR msgsnd (2),
778 .BR semop (2),
779 .BR semtimedop (2).
780 .IP *
781 スリープ用のインターフェイス:
782 .BR clock_nanosleep (2),
783 .BR nanosleep (2),
784 .BR usleep (3).
785 .IP *
786 .BR inotify (7)
787 ファイルディスクリプタからの
788 .BR read (2).
789 .IP *
790 .BR io_getevents (2).
791 .RE
792 .PP
793 .BR sleep (3)
794 関数も、ハンドラにより割り込まれた場合、決して再スタートされることはない。
795 しかし、成功となり、残っている停止時間を返す。
796 .SS 一時停止シグナルによるシステムコールやライブラリ関数への割り込み
797 Linux では、シグナルハンドラが設定されていない場合でも、
798 いくつかのブロッキング型のインターフェイスは、
799 プロセスが一時停止 (stop) シグナルの一つにより停止され、
800 .B SIGCONT
801 により再開された後に、エラー
802 .B EINTR
803 で失敗する可能性がある。
804 この挙動は POSIX.1 で認められておらず、他のシステムでは起こらない。
805
806 この挙動を示す Linux のインターフェイスは以下の通りである。
807 .RS 4
808 .IP * 2
809 .BR setsockopt (2)
810 を使ってタイムアウトが設定されているソケットインターフェース:
811 .BR accept (2),
812 .BR recv (2),
813 .BR recvfrom (2),
814 .BR recvmsg (2)
815 で受信タイムアウト
816 .RB ( SO_RCVTIMEO )
817 が設定されている場合と、
818 .BR connect (2),
819 .BR send (2),
820 .BR sendto (2),
821 .BR sendmsg (2)
822 で送信タイムアウト
823 .RB ( SO_SNDTIMEO )
824 が設定されている場合。
825 .IP * 2
826 .BR epoll_wait (2),
827 .BR epoll_pwait (2).
828 .IP *
829 .BR semop (2),
830 .BR semtimedop (2).
831 .IP *
832 .BR sigtimedwait (2),
833 .BR sigwaitinfo (2).
834 .IP *
835 .BR inotify (7)
836 ファイルディスクリプタからの
837 .BR read (2).
838 .IP *
839 Linux 2.6.21 以前:
840 .BR futex (2)
841 .BR FUTEX_WAIT ,
842 .BR sem_timedwait (3),
843 .BR sem_wait (3).
844 .IP *
845 Linux 2.6.8 以前:
846 .BR msgrcv (2),
847 .BR msgsnd (2).
848 .IP *
849 Linux 2.4 以前:
850 .BR nanosleep (2).
851 .RE
852 .SH 準拠
853 POSIX.1 (注記した内容以外)。
854 .SH バグ
855 .B SIGIO
856
857 .B SIGLOST
858 は同じ値を持っている。
859 .B SIGLOST
860 はカーネルのソースではコメントアウトされている。
861 しかし、ソフトウェアによってはビルドの過程でシグナル 29 を
862 .B SIGLOST
863 とみなしてしまうものがある。
864 .SH 関連項目
865 .BR kill (1),
866 .BR getrlimit (2),
867 .BR kill (2),
868 .BR killpg (2),
869 .BR rt_sigqueueinfo (2),
870 .BR setitimer (2),
871 .BR setrlimit (2),
872 .BR sgetmask (2),
873 .BR sigaction (2),
874 .BR sigaltstack (2),
875 .BR signal (2),
876 .BR signalfd (2),
877 .BR sigpending (2),
878 .BR sigprocmask (2),
879 .BR sigsuspend (2),
880 .BR sigwaitinfo (2),
881 .BR abort (3),
882 .BR bsd_signal (3),
883 .BR longjmp (3),
884 .BR raise (3),
885 .BR pthread_sigqueue (3),
886 .BR sigqueue (3),
887 .BR sigset (3),
888 .BR sigsetops (3),
889 .BR sigvec (3),
890 .BR sigwait (3),
891 .BR strsignal (3),
892 .BR sysv_signal (3),
893 .BR core (5),
894 .BR proc (5),
895 .BR pthreads (7),
896 .BR sigevent (7)