Rechercher une page de manuel
signal
Langue: ja
Version: 2007-06-03 (fedora - 25/11/07)
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_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), 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)Contenus ©2006-2023 Benjamin Poulain
Design ©2006-2023 Maxime Vantorre