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
-
signal現在処理中のシグナル番号を第一引数とする(非同期ハンドラは自身を再登録可能だが、他のシグナルは不可) -
<stdatomic.h>からのアトミック関数(アトミック引数がロックフリーの場合) - atomic_is_lock_free (あらゆる種類のアトミック引数に対して)
- シグナルハンドラは、静的 またはスレッドローカル (C11以降) storage duration を持つオブジェクトのうち、ロックフリーでない atomic (C11以降) を除き、静的 volatile sig_atomic_t への代入以外の方法で参照する。
シグナルハンドラへのエントリ時、浮動小数点環境の状態およびすべてのオブジェクトの値は未規定ですが、以下を除きます
- volatile sig_atomic_t 型のオブジェクト
- ロックフリーなアトミック型のオブジェクト (C11以降)
- atomic_signal_fence を通じて可視化される副作用 (C11以降)
シグナルハンドラからの復帰時、シグナルハンドラによって変更されたオブジェクトの値は、 volatile sig_atomic_t またはロックフリーアトミック (C11以降) でない場合、未定義となります。
マルチスレッドプログラムで signal が使用された場合、動作は未定義です。スレッドセーフである必要はありません。
注記
POSIXでは
signal
がスレッドセーフであることを要求しており、
任意のシグナルハンドラから呼び出せる非同期シグナルセーフなライブラリ関数のリスト
を規定しています。
abort
および
raise
に加えて、POSIXでは
kill
、
pthread_kill
、および
sigqueue
が同期シグナルを生成することを規定しています。
POSIXは、シグナルハンドラ実行中のシグナル配送に関する未定義の動作と実装間の大きな差異から、
sigaction
の使用を
signal
よりも推奨しています。
例
#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
参考文献
- C17規格 (ISO/IEC 9899:2018):
-
- 7.14.1.1 signal関数 (p: 193-194)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.14.1.1 signal関数 (p: 266-267)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.14.1.1 signal関数 (p: 247-248)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.7.1.1 signal関数
関連項目
|
特定のシグナルに対してシグナルハンドラを実行する
(関数) |
|
|
C++ documentation
for
signal
|
|