signal
ヘッダ <signal.h> で定義
|
||
void (*signal( int sig, void (*handler) (int))) (int); |
||
シグナル sig
のためのハンドラを設定します。 シグナルハンドラは、デフォルトの処理を行う、シグナルを無視する、またはユーザ定義の関数が呼ばれるように設定することができます。
シグナルハンドラが関数に設定され、シグナルが発生したとき、シグナルハンドラの開始直前に signal(sig, SIG_DFL) が実行されるかどうかは処理系定義です。 また処理系は、シグナルハンドラを実行している間、処理系定義のシグナルの集合が発生しないように防ぐかもしれません。
目次 |
[編集] 引数
sig | - | シグナルハンドラを設定するシグナル。 処理系定義の値、または以下の値のいずれか。
| ||||||
handler | - | シグナルハンドラ。 以下のいずれかでなければなりません。
|
[編集] 戻り値
成功した場合は以前のシグナルハンドラ、失敗した場合は SIG_ERR (処理系によってはシグナルハンドラの設定は無効化されていることがあります)。
[編集] シグナルハンドラ
シグナルハンドラとしてインストールされるユーザ定義の関数には、以下の制限が課されます。
SIGFPE、 SIGILL または SIGSEGV を処理するとき、ユーザ定義の関数から戻ると、動作は未定義です。
abort または raise の結果としてシグナルハンドラが呼ばれた場合、シグナルハンドラが raise を呼ぶと、動作は未定義です。
abort または raise の結果としてではなくシグナルハンドラが呼ばれた場合 (別の言い方をすると、シグナルハンドラが非同期の場合)、以下は未定義動作となります。
- シグナルハンドラが標準ライブラリ内の何らかの関数を呼ぶ。 ただし以下を除きます。
- abort
- _Exit
- quick_exit
- 現在処理中のシグナル番号を第1引数に指定した
signal
(非同期ハンドラは自分自身を再登録することができますが、他のシグナルはできません)。 - <stdatomic.h> のアトミック関数、ただしアトミック引数がロックフリーな場合に限られます。
- atomic_is_lock_free (あらゆる種類のアトミック引数に対して使用できます)
- シグナルハンドラが、静的またはスレッドローカル (C11以上)記憶域期間を持つ、ロックフリーな atomic 以外の (C11以上)任意のオブジェクトを参照する。 ただし静的な volatile sig_atomic_t への代入は除きます。
シグナルハンドラの開始時、以下を除くすべてのオブジェクトの値および浮動小数点環境の状態は未規定です。
- volatile sig_atomic_t 型のオブジェクト。
|
(C++11以上) |
シグナルハンドラから戻るとき、 volatile sig_atomic_t またはロックフリーなアトミック (C11以上)以外の、シグナルハンドラで変更されたあらゆるオブジェクトの値は、不定になります。
マルチスレッドプログラムで signal が使用された場合、動作は未定義です。 スレッドセーフであることは要求されていません。
[編集] ノート
POSIX は、 signal
がスレッドセーフであることを要求しており、任意のシグナルハンドラから呼ぶことができる非同期シグナルセーフなライブラリ関数の一覧を規定しています。
abort
および raise
に加えて、 POSIX は kill
、 pthread_kill
および sigqueue
も同期シグナルを生成すると規定しています。
POSIX は、シグナルハンドラ実行中のシグナル配信に関して、その仕様の曖昧な動作や大きな幅のある実装のバリエーションのため、 signal
の代わりに sigaction を推奨しています。
[編集] 例
#include <signal.h> #include <stdio.h> volatile sig_atomic_t gSignalStatus; void signal_handler(int signal) { gSignalStatus = signal; } int main(void) { signal(SIGINT, signal_handler); printf("SignalValue: %d\n", gSignalStatus); printf("Sending signal: %d\n", SIGINT); raise(SIGINT); printf("SignalValue: %d\n", gSignalStatus); }
出力:
SignalValue: 0 Sending signal: 2 SignalValue: 2