signal

Autres langues

Langue: ja

Version: 2000-04-28 (mandriva - 01/05/08)

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() システム・コールは signum で指定された番号のシグナルに 新しいシグナル・ハンドラーを設定する。 このシグナル・ハンドラーは handler に設定される。 handler は、ユーザーの指定した関数、 SIG_IGNSIG_DFL のいずれかである。

シグナル番号 signum のシグナルを受けると次のように動作する。 対応するハンドラーが SIG_IGN に設定されている場合は、シグナルは無視される。 ハンドラーが SIG_DFL に設定されている場合は、シグナルに関連づけられた デフォルトの動作を行う (signal(7) を参照)。 ハンドラーが関数 handler に設定されている場合は、まず最初にハンドラーが SIG_DFL にリセットされ (あるいは実装に依存するシグナルのブロックが実行され)、 次に signum を引き数として handler が呼ばれる。

シグナルに対してシグナルハンドラー関数を使うことは、 「シグナルのキャッチ」と呼ばれる。 シグナル SIGKILLSIGSTOP はキャッチできず、無視することもできない。

返り値

signal() 関数は今までのシグナル・ハンドラーの値を返すか、エラーの場合は SIG_ERR を返す。

準拠

C89, C99, POSIX.1-2001.

注意

マルチスレッドプロセスにおけるこの関数の結果は、指定されていない。

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 に再定義されて BSD 方式となる。 これは推奨されない。

glibc2 システムにおいて _XOPEN_SOURCE のような機能検査マクロを定義したり、この関数とは別の sysv_signal 関数を使ったりすれば、以前のような動作をする。 これは推奨されない。

マクロの定義やファイルのインクルードで この関数の方式を変更しようとするのは、良くない考え方である。 signal() を使うのを完全に避けて、代わりに sigaction(2) を使った方が良い。

関連項目

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), sigsetops(3), sigvec(3), sysv_signal(3), feature_test_macros(7), signal(7)