signal

Autres langues

Langue: ja

Version: 2007-06-03 (fedora - 25/11/07)

Autres sections - même nom

Section: 2 (Appels système)

名前

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_IGNSIG_DFL、 プログラマが定義した関数 (「シグナル・ハンドラ」) のアドレスの いずれかを指定する。

シグナル signum がプロセスに配送されると、以下のいずれかが発生する。

*
処理方法が SIG_IGN に設定されている場合、そのシグナルは無視される。
*
処理方法が SIG_DFL に設定されている場合、シグナルに関連づけられた デフォルトの動作が行われる (signal(7) 参照)。
*
処理方法として関数が設定されている場合、 まず最初に処理方法が SIG_DFL にリセットされるかそのシグナルのブロックが実行された後、 signum を引き数として handler が呼び出される。 ハンドラが起動される際にシグナルがブロックされた場合、 ハンドラが返る際にそのシグナルのブロックが解除される。

シグナル SIGKILLSIGSTOP は捕捉できず、無視することもできない。

返り値

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), pause(2), sigaction(2), sigpending(2), sigprocmask(2), sigqueue(2), sigsuspend(2), bsd_signal(3), killpg(3), raise(3), siginterrupt(3), sigsetops(3), sigvec(3), sysv_signal(3), feature_test_macros(7), signal(7)