SIGNAL(2) | Linux Programmer's Manual | SIGNAL(2) |
名前
signal - ANSI C シグナル操作書式
#include <signal.h>説明
signal() の動作は UNIX のバージョンにより異なる。また、歴史的に見て Linux のバージョンによっても異なっている。 このシステムコールの使用は避け、 代わりに sigaction(2) を使用すること。下記の「移植性」を参照。- *
- 処理方法が 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 を無視 (ignore) した場合、その後の動作は未定義である。ゼロによる整数割り算の結果は未定義となる。アーキテクチャーによっては、このとき SIGFPE シグナルが生成される。 (同様に負の最大整数を-1 で割ると SIGFPE が生成されるかもしれない) このシグナルを無視すると無限ループに陥るかもしれない。
SIGCHLD の動作として SIG_IGN を設定した場合の詳細な動作については、 sigaction(2) を参照すること。
シグナル・ハンドラ内から安全に呼び出すことができる、 async-signal-safe functions (非同期シングルで安全な関数) のリストについては signal(7) を参照。
sighandler_t の使用は GNU 拡張であり、 _GNU_SOURCE が定義された場合に公開される。glibc では _BSD_SOURCE が定義された場合には (BSD 由来の) sig_t も定義される。このような型を使用しないと、 signal() の宣言は読みにくいものとなる。
void ( *signal(int signum, void (*handler)(int)) ) (int);
移植性
移植性のある signal() の使い方は、シグナルの処理方法を SIG_DFL か SIG_IGN に設定する方法だけである。シグナル・ハンドラを設定するのに signal() を使ったときの動作はシステムにより異なる (POSIX.1 は明示的にこの違いを認めている)。 移植性が必要なときはこのシステムコールを使用しないこと。sa.sa_flags = SA_RESETHAND | SA_NODEFER;
sa.sa_flags = SA_RESTART;
- *
- カーネルの signal() システムコールは System V 方式を提供している。
- *
-
デフォルトでは、glibc 2 以降では、
signal() ラッパー関数はカーネルのシステムコールを起動しない。代わりに、ラッパー関数は BSD 方式を示すフラグを使って
sigaction(2) を呼び出す。機能検査マクロ
_BSD_SOURCE を定義していれば、このデフォルトの動作となる。デフォルトでは、
_BSD_SOURCE が定義される。
_BSD_SOURCE は
_GNU_SOURCE が定義された場合には暗黙のうちに定義され、もちろん明示的に定義することもできる。
- *
- Linux の libc4 と libc5 の signal() 関数は System V 方式である。 libc5 システムにおいて <signal.h> のかわりに <bsd/signal.h> をインクルードすると、 signal() は __bsd_signal() に再定義され、 signal() は BSD 方式となる。
関連項目
kill(1), alarm(2), kill(2), killpg(2), pause(2), sigaction(2), signalfd(2), sigpending(2), sigprocmask(2), sigsuspend(2), bsd_signal(3), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), sysv_signal(3), signal(7)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-02-09 | Linux |