aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/man/man2/sigaction.2
blob: 6f778ac1ed5219f15a1fecb22ea5ac92408681d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
.\" Copyright (c) 1980, 1990, 1993
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"	From: @(#)sigaction.2	8.2 (Berkeley) 4/3/94
.\" %FreeBSD: src/lib/libc/sys/sigaction.2,v 1.19.2.1 1999/08/29 14:49:26 peter Exp %
.\"
.\" 2001/01/01 horikawa@jp.FreeBSD.org
.\" sigvec.2 を更新する場合は、共通部分の多い sigaction.2 も同時に更新
.\" してください。
.\"
.Dd April 3, 1994
.Dt SIGACTION 2
.Os
.Sh 名称
.Nm sigaction
.Nd ソフトウェアシグナル機能
.Sh 書式
.Fd #include <signal.h>
.Bd -literal
struct sigaction {
	void     (*sa_handler)();  /* シグナルハンドラ */
	sigset_t sa_mask;          /* 適用するシグナルマスク */
	int	 sa_flags;         /* 後述のシグナルオプションを参照 */
};
.Ed
.Ft int
.Fn sigaction "int sig" "const struct sigaction *act" "struct sigaction *oact"
.Sh 解説
システムではシグナルの集合を定義しており、
これらはプロセスに配信されることがあります。
シグナルの配信は、
ハードウェア割込みの発生に似ています。通常の場合、
シグナルのさらなる発生はブロックされ、
現在のプロセスコンテキストは保存されて、新しいプロセスコンテキストが
作成されます。プロセスは、シグナルの配信先
.Em handler
を指定することもあれば、シグナルを
.Em 無視
することを指定することもあります。
シグナルが発生した場合に、システムがデフォルトのアクションを取る
ことを指定することも可能です。
シグナルが
.Em ブロック
されることもあり、
その場合、シグナルの配信は、
.Em ブロックが解除
されるまで延期されます。
配信時に取るアクションは、配信時に決まります。通常の場合は、
シグナルハンドラが、プロセスの現行スタックで動作します。
これはハンドラによって変更可能であり、
変更すれば、シグナルは特殊な
.Em シグナルスタック
でハンドル可能です。
.Pp
通常の場合、シグナルルーチンは、呼び出しの原因となったシグナルが
ブロックされた状態で動作しますが、その他のシグナルが発生する可能性は
あります。グローバルの
.Em シグナルマスク
には、プロセスへの配信が現在
ブロックされているシグナルの集合が定義されています。プロセスの
シグナルマスクは、親のシグナルマスクで初期化されます (通常は空)。
.Xr sigprocmask 2
が呼び出された場合、またはシグナルがプロセスに配信された場合に、
シグナルマスクは変更されます。
.Pp
シグナル条件がプロセスで発生すると、シグナルが、プロセスで保留に
なっているシグナルの集合に追加されます。
そのシグナルがプロセスで
現在
.Em ブロック
されていない場合は、プロセスに配信されます。
シグナルは、
プロセスがオペレーティングシステムに入ったときに (システム呼び出し、
ページエラーやトラップ、クロック割込み中などに) 配信されます。
複数のシグナルの配信準備が同時に整った場合は、トラップで生じたシグナルが
先に配信されます。
その他のシグナルは、それぞれが前のシグナルのハンドラに対し、
最初の命令の前に割り込んだ状態で同時に処理されます。
保留になっているシグナルの集合は、
.Xr sigpending 2
関数で返されます。
補足されたシグナルが配信されると、プロセスの現在の
状態が保存され、新しいシグナルマスクが以下で説明するように算出されて、
シグナルハンドラが呼び出されます。
ハンドラの呼び出しは、
シグナル処理ルーチンが正常に戻った場合に、プロセスがシグナル配信前の
コンテキストで実行を再開するように編成されます。
プロセスが別のコンテキストでの再開を望む場合は、
前のコンテキストそのものを回復するように編成する必要があります。
.Pp
シグナルがプロセスに配信されると、プロセスの
シグナルハンドラが続く間 (または
.Fn sigprocmask
が呼び出されるまで)、新しいシグナルマスクが設置されます。
このマスクは、現在のシグナルマスク集合、配信されるシグナル、
呼び出されるハンドラに関連したシグナルマスクの和集合を取って形成されます。
.Pp
.Fn sigaction
は、
.Fa sig
で指定したシグナルのアクションを割り当てます。
.Fa act
が 0 でない場合は、アクション
.Pf ( Dv SIG_DFL ,
.Dv SIG_IGN
かハンドラルーチン)、および指定されたシグナルの配信時に
使用するマスクが指定されます。
.Fa oact
が 0 でない場合は、シグナルの前の処理情報がユーザに返されます。
.Pp
シグナルハンドラが設置されると、通常の場合は
.Fn sigaction
を再度呼び出すか
.Xr execve 2
を実行するまでシグナルハンドラは設置されたまま残ります。
シグナルに固有なデフォルトアクションへは、
.Fa sa_handler
を
.Dv SIG_DFL
に設定することでリセットできます。
デフォルトは、プロセスの終了
(コアダンプが取られることもあります)、アクションなし、プロセスの停止、
プロセスの継続です。
それぞれのシグナルのデフォルトアクションについては、
以下のシグナルリストを参照してください。
.Fa sa_handler
が
.Dv SIG_DFL
である場合、シグナルのデフォルトアクションはシグナルの放棄になります。
また、シグナルが保留になっている場合でも、シグナルがマスクさ
れていても保留中のシグナルは放棄されます。
.Fa sa_handler
を
.Dv SIG_IGN
に設定すると、シグナルの現在と保留中のインスタンスは無視されて放棄されます。
.Pp
オプションは、
.Ar sa_flags
を設定することで指定できます。それぞれの
ビットの意味は以下のとおりです。
.Bl -tag -offset indent -width SA_RESETHANDXX
.It Dv SA_NOCLDSTOP
.Dv SIGCHLD
シグナルの受信関数を設置する場合にこのビットを設定すると、
子プロセスが停止したときではなく、子プロセスが終了するときにのみ、
.Dv SIGCHLD
シグナルが生成されます。
.It SA_NOCLDWAIT
.Dv SIGCHLD
シグナルで
.Fn sigaction
を呼び出す場合にこのビットを設定すると、システムは、呼び出し側プロセスの
子が終了したときにゾンビプロセスを作成しなくなります。呼び出し側プロセスが
.Xr wait 2
かそれに相当するものを続けて発行すると、呼び出し側プロセスのすべて
の子プロセスが終了するまでブロックし、次に
.Va errno
を
.Dv ECHILD
に設定して -1 を返します。
.It Dv SA_ONSTACK
このビットを設定すると、システムは、
.Xr sigaltstack 2
で指定された
.Em シグナルスタック
で、プロセスにシグナルを配信します。
.It Dv SA_NODEFER
このビットを設定すると、配信済みシグナルのさらなる発生が、
ハンドラの実行中にマスクされなくなります。
.It Dv SA_RESETHAND
このビットを設定すると、シグナルが配信された瞬間に、ハンドラが
.Dv SIG_DFL
にリセットされます。
.\" Still missing:
.\" .It Dv SA_SIGINFO
.El
.Pp
以下のリストのシステムコール中にシグナルが補足されると、呼び出しは、エラー
.Dv EINTR
で強制終了されるか、要求より短いデータ転送で戻るか、
または再開されます。
保留中のシステムコールの再開は、
.Ar sa_flags
で
.Dv SA_RESTART
ビットを設定することで要求できます。
影響を受けるシステムコールは、
通信チャネルか遅いデバイス (端末など。通常ファイルではない) に対する
.Xr open 2 ,
.Xr read 2 ,
.Xr write 2 ,
.Xr sendto 2 ,
.Xr recvfrom 2 ,
.Xr sendmsg 2 ,
.Xr recvmsg 2
と
.Xr wait 2 ,
.Xr ioctl 2
の途中です。
しかし、すでに実行されているシステムコールは再開されず、
部分的な結果 (短い読取りカウントなど) を返します。
.Pp
.Xr fork 2
か
.Xr vfork 2
の後では、すべてのシグナル、シグナルマスク、シグナルスタック、
再開 / 割込みフラグが子に継承されます。
.Pp
.Xr execve 2
は、補足されたすべてのシグナルのデフォルトアクションを元に戻し、
ユーザスタックで受信されるすべてのシグナルをリセットします。
無視されたシグナルは無視されたままです。
シグナルマスクは同じ状態のままです。
保留中のシステムコールを再開するシグナルは、その再開を続けます。
.Pp
以下はすべてのシグナルのリストです。名称は、インクルードファイル
.Aq Pa signal.h
と同じです。
.Bl -column SIGVTALARMXX "create core imagexxx"
.It Sy "  名称" "	デフォルトアクション" "	説明"
.It Dv SIGHUP No "	プロセスの終了" "	端末ラインのハングアップ"
.It Dv SIGINT No "	プロセスの終了" "	プログラムの割込み"
.It Dv SIGQUIT No "	コアイメージの作成" "	プログラムの終了"
.It Dv SIGILL No "	コアイメージの作成" "	不正な命令"
.It Dv SIGTRAP No "	コアイメージの作成" "	トラップの追跡"
.It Dv SIGABRT No "	コアイメージの作成" Xr 	abort 3 の呼び出し (以前の
.Dv SIGIOT )
.It Dv SIGEMT No "	コアイメージの作成" "	実行された命令のエミュレート"
.It Dv SIGFPE No "	コアイメージの作成" "	浮動小数例外"
.It Dv SIGKILL No "	プロセスの終了" "	プログラムの終了"
.It Dv SIGBUS No "	コアイメージの作成" "	バスエラー"
.It Dv SIGSEGV No "	コアイメージの作成" "	セグメンテーション違反"
.It Dv SIGSYS No "	コアイメージの作成" "	存在しないシステムコールの呼び出し"
.It Dv SIGPIPE No "	プロセスの終了" "	読取り側がないパイプへの書込み"
.It Dv SIGALRM No "	プロセスの終了" "	リアルタイムタイマの満了"
.It Dv SIGTERM No "	プロセスの終了" "	ソフトウェア終了シグナル"
.It Dv SIGURG No "	シグナルの放棄" "	緊急事態がソケットに存在"
.It Dv SIGSTOP No "	プロセスの停止" "	停止 (補足も無視もできません)"
.It Dv SIGTSTP No "	プロセスの停止" "	キーボードから生成された停止シグナル"
.It Dv SIGCONT No "	シグナルの放棄" "	停止後の継続"
.It Dv SIGCHLD No "	シグナルの放棄" "	子ステータスの変化"
.It Dv SIGTTIN No "	プロセスの停止" "	制御端末からバックグラウンド読取りしようとした"
.It Dv SIGTTOU No "	プロセスの停止" "	制御端末にバックグラウンド書込みしようとした"
.It Dv SIGIO No "	シグナルの放棄" "	記述子に "
.Tn I/O
可能 (
.Xr fcntl 2 
参照)
.It Dv SIGXCPU No "	プロセスの終了" "	cpu 制限時間の超過 ("
.Xr setrlimit 2 
参照)
.It Dv SIGXFSZ No "	プロセスの終了" "	ファイルサイズ制限の超過 ("
.Xr setrlimit 2 
参照)
.It Dv SIGVTALRM No "	プロセスの終了" "	仮想時間アラーム ("

.Xr setitimer 2 
参照)
.It Dv SIGPROF No "	プロセスの終了" "	プロファイリングタイマアラーム (
.Xr setitimer 2 
参照)
.It Dv SIGWINCH No "	シグナルの放棄" "	ウィンドウサイズの変化"
.It Dv SIGINFO No "	シグナルの放棄" "	キーボードからのステータス要求"
.It Dv SIGUSR1 No "	プロセスの終了" "	ユーザ定義シグナル 1"
.It Dv SIGUSR2 No "	プロセスの終了" "	ユーザ定義シグナル 2"
.El
.Sh 注
.Fa act
に指定する
.Fa sa_mask
フィールドでは、
.Dv SIGKILL
や
.Dv SIGSTOP
をブロックできません。ブロックしようとしても無視されます。
.Pp
以下の関数は、再入的であるかシグナルで割り込まれることがないかのどちら
かで、非同期シグナルでも安全です。このため、アプリケーションは、
シグナル受信関数から制限なく呼び出せます。
.Pp
ベースインタフェース
.Pp
.Fn _exit ,
.Fn access ,
.Fn alarm ,
.Fn cfgetispeed ,
.Fn cfgetospeed ,
.Fn cfsetispeed ,
.Fn cfsetospeed ,
.Fn chdir ,
.Fn chmod ,
.Fn chown ,
.Fn close ,
.Fn creat ,
.Fn dup ,
.Fn dup2 ,
.Fn execle ,
.Fn execve ,
.Fn fcntl ,
.Fn fork ,
.Fn fpathconf ,
.Fn fstat ,
.Fn fsync ,
.Fn getegid ,
.Fn geteuid ,
.Fn getgid ,
.Fn getgroups ,
.Fn getpgrp ,
.Fn getpid ,
.Fn getppid ,
.Fn getuid ,
.Fn kill ,
.Fn link ,
.Fn lseek ,
.Fn mkdir ,
.Fn mkfifo ,
.Fn open ,
.Fn pathconf ,
.Fn pause ,
.Fn pipe ,
.Fn raise ,
.Fn read ,
.Fn rename ,
.Fn rmdir ,
.Fn setgid ,
.Fn setpgid ,
.Fn setsid ,
.Fn setuid ,
.Fn sigaction ,
.Fn sigaddset ,
.Fn sigdelset ,
.Fn sigemptyset ,
.Fn sigfillset ,
.Fn sigismember ,
.Fn signal ,
.Fn sigpending ,
.Fn sigprocmask ,
.Fn sigsuspend ,
.Fn sleep ,
.Fn stat ,
.Fn sysconf ,
.Fn tcdrain ,
.Fn tcflow ,
.Fn tcflush ,
.Fn tcgetattr ,
.Fn tcgetpgrp ,
.Fn tcsendbreak ,
.Fn tcsetattr ,
.Fn tcsetpgrp ,
.Fn time ,
.Fn times ,
.Fn umask ,
.Fn uname ,
.Fn unlink ,
.Fn utime ,
.Fn wait ,
.Fn waitpid ,
.Fn write
.Pp
リアルタイムインタフェース
.Pp
.Fn aio_error ,
.Fn clock_gettime ,
.Fn sigpause ,
.Fn timer_getoverrun ,
.Fn aio_return ,
.Fn fdatasync ,
.Fn sigqueue ,
.Fn timer_gettime ,
.Fn aio_suspend ,
.Fn sem_post ,
.Fn sigset ,
.Fn timer_settime
.Pp
上のリストに記載されていないすべての関数は、シグナルに関して安全でない
と考えられます。
つまり、そのような関数の動きは、シグナルハンドラから呼び出されると不定です。
.Pp
.Sh 戻り値
0 は、呼び出しに問題がなかったことを表わします。
-1 は、エラーが発生し、
.Va errno
がエラーの理由を示すように設定されていることを表わします。
.Pp
.Sh 使用例
ハンドラルーチンは、以下のように宣言できます。
.Bd -literal -offset indent
void handler(sig, code, scp)
int sig, code;
struct sigcontext *scp;
.Ed
.Pp
.Fa sig
は、ハードウェアエラーとトラップがマップされているシグナル番号です。
.Fa code
は、ハードウェアが提供する定数かコードであるパラメータです。
.Fa scp
は、
.Fa sigcontext
構造体のポインタ (
.Aq Pa signal.h 
で定義されています) で、シグナル前のコンテキストを回復するために使用されます。
.Sh エラー
以下のうち 1 つが発生すると、
.Fn sigaction
はエラーになり、新しいシグナルハンドラは設置されません。
.Bl -tag -width Er
.It Bq Er EFAULT
.Fa act
か
.Fa oact
は、プロセスに割り当てられたアドレス空間の範囲外を指しています。
.It Bq Er EINVAL
.Fa sig
が、正しいシグナル番号になっていません。
.It Bq Er EINVAL
.Dv SIGKILL
か
.Dv SIGSTOP
のハンドラを無視するか提供しようとしました。
.El
.Sh 規格
.Fn sigaction
関数呼び出しは、
.St -p1003.1-90
に準拠しています。
.Dv SA_ONSTACK
フラグと
.Dv SA_RESTART
フラグは、
.Dv SIGTRAP ,
.Dv SIGEMT ,
.Dv SIGBUS ,
.Dv SIGSYS ,
.Dv SIGURG ,
.Dv SIGIO ,
.Dv SIGXCPU ,
.Dv SIGXFSZ ,
.Dv SIGVTALRM ,
.Dv SIGPROF ,
.Dv SIGWINCH ,
.Dv SIGINFO
シグナルと同じように、
Berkeley の拡張機能です。これらのシグナルは、
.Tn BSD
から派生した、ほとんどのシステムで使用できます。
.Dv SA_NODEFER
フラグと
.Dv SA_RESETHAND
フラグは、その他のオペレーティングシステムとの下位互換性を保つためのものです。
.Dv SA_NOCLDSTOP
フラグと
.Dv SA_NOCLDWAIT
フラグは、その他のオペレーティングシステムで一般的に見られるオプションです。
.Sh 関連項目
.Xr kill 1 ,
.Xr kill 2 ,
.Xr ptrace 2 ,
.Xr sigaltstack 2 ,
.Xr sigblock 2 ,
.Xr sigpause 2 ,
.Xr sigpending 2 ,
.Xr sigprocmask 2 ,
.Xr sigsetmask 2 ,
.Xr sigsuspend 2 ,
.Xr sigvec 2 ,
.Xr wait 2 ,
.Xr fpsetmask 3 ,
.Xr setjmp 3 ,
.Xr siginterrupt 3 ,
.Xr sigsetops 3 ,
.Xr tty 4