SIGNAL
Section: Linux Programmer's Manual (2)
Updated: 2007-06-03
Index
JM Home Page
roff page
名前
signal - ANSI C シグナル操作
書式
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
説明
signal()
の動作は Unix のバージョンにより異なる。
また、歴史的に見て Linux のバージョンによっても異なっている。
このシステムコールの使用は避け、
代わりに
sigaction(2)
を使用すること。
下記の「移植性」を参照。
signal()
はシグナル
signum
の処理方法を
handler
に設定する。
handler
には、
SIG_IGN、
SIG_DFL、
プログラマが定義した関数 (「シグナル・ハンドラ」) のアドレスの
いずれかを指定する。
シグナル
signum
がプロセスに配送されると、以下のいずれかが発生する。
- *
-
処理方法が
SIG_IGN
に設定されている場合、そのシグナルは無視される。
- *
-
処理方法が
SIG_DFL
に設定されている場合、シグナルに関連づけられた
デフォルトの動作が行われる
(signal(7)
参照)。
- *
-
処理方法として関数が設定されている場合、
まず最初に処理方法が
SIG_DFL
にリセットされるかそのシグナルのブロックが実行された後、
signum
を引き数として
handler
が呼び出される。
ハンドラが起動される際にシグナルがブロックされた場合、
ハンドラが返る際にそのシグナルのブロックが解除される。
シグナル
SIGKILL
と
SIGSTOP
は捕捉できず、無視することもできない。
返り値
signal()
は、今までのシグナル・ハンドラの値を返す。エラーの場合は
SIG_ERR
を返す。
エラー
- EINVAL
-
signum
が不正である。
準拠
C89, C99, POSIX.1-2001.
注意
マルチスレッドプロセスにおける
signal()
の結果は、指定されていない。
POSIX によると、
kill(2)
や
raise(3)
で生成できない
SIGFPE,
SIGILL,
SIGSEGV
シグナルを無視した後の動作は未定義である。
0 による整数割り算の結果は未定義となる。
ある種のアーキテクチャでは、これは
SIGFPE
シグナルを生成する。
(同様に負の最大整数を -1 で割ると
SIGFPE
が生成されるかもしれない。)
このシグナルを無視すると無限ループに陥るかもしれない。
SIGCHLD
の動作として
SIG_IGN
を設定した場合の詳細な動作については、
sigaction(2)
を参照すること。
シグナル・ハンドラ内から安全に呼び出すことができる、
async-signal-safe functions (非同期シングルで安全な関数) の
リストについては
signal(7)
を参照。
sighandler_t
の使用は GNU 拡張である。
各種バージョンの libc でこの型は定義済みである;
libc4 と libc5 では
SignalHandler
を定義している。
glibc では
sig_t
を定義しており、
_GNU_SOURCE
が定義されている場合には
sighandler_t
も定義されている。
移植性
Unix のオリジナルの
signal()
はハンドラを
SIG_DFL
にリセットする。
System V (と Linux カーネルと libc4,5) も同じである。
一方、BSD ではハンドラのリセットを行わず、
ハンドラが呼ばれている間に
シグナルの新しいインスタンスが発生するのをブロックする。
glibc2 ライブラリでは BSD の動作に従っている。
libc5 システムにおいて
<signal.h>
のかわりに
<bsd/signal.h>
をインクルードすると、
signal()
は
__bsd_signal()
に再定義され、
signal()
は BSD 方式となる。
これは推奨されない。
glibc2 システムにおいて
_XOPEN_SOURCE
のような機能検査マクロを定義したり、この関数とは別の
sysv_signal(3)
関数を使ったりすれば、以前のような動作をする。
これは推奨されない。
関連項目
kill(1),
alarm(2),
kill(2),
killpg(2),
pause(2),
sigaction(2),
sigpending(2),
sigprocmask(2),
sigqueue(2),
sigsuspend(2),
bsd_signal(3),
raise(3),
siginterrupt(3),
sigsetops(3),
sigvec(3),
sysv_signal(3),
feature_test_macros(7),
signal(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 注意
-
- 移植性
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:32:03 GMT, November 19, 2007