名前空間
変種
操作

signal

提供: cppreference.com
< c‎ | program
ヘッダ <signal.h> で定義
void (*signal( int sig, void (*handler) (int))) (int);

シグナル sig のためのハンドラを設定します。 シグナルハンドラは、デフォルトの処理を行う、シグナルを無視する、またはユーザ定義の関数が呼ばれるように設定することができます。

シグナルハンドラが関数に設定され、シグナルが発生したとき、シグナルハンドラの開始直前に signal(sig, SIG_DFL) が実行されるかどうかは処理系定義です。 また処理系は、シグナルハンドラを実行している間、処理系定義のシグナルの集合が発生しないように防ぐかもしれません。

目次

[編集] 引数

sig - シグナルハンドラを設定するシグナル。 処理系定義の値、または以下の値のいずれか。
シグナルの種類の定義
(マクロ定数) [edit]


handler - シグナルハンドラ。 以下のいずれかでなければなりません。
  • SIG_DFL マクロ。 シグナルハンドラはデフォルトのシグナルハンドラに設定されます。
  • SIG_IGN マクロ。 シグナルは無視されます。
  • 関数へのポインタ。 関数のシグネチャは以下と同等でなければなりません。
void fun(int sig);

[編集] 戻り値

成功した場合は以前のシグナルハンドラ、失敗した場合は SIG_ERR (処理系によってはシグナルハンドラの設定は無効化されていることがあります)。

[編集] シグナルハンドラ

シグナルハンドラとしてインストールされるユーザ定義の関数には、以下の制限が課されます。

SIGFPESIGILL または 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 への代入は除きます。

シグナルハンドラの開始時、以下を除くすべてのオブジェクトの値および浮動小数点環境の状態は未規定です。

  • ロックフリーなアトミック型のオブジェクト。
  • atomic_signal_fence を通して可視となる副作用。
(C++11以上)

シグナルハンドラから戻るとき、 volatile sig_atomic_t またはロックフリーなアトミック (C11以上)以外の、シグナルハンドラで変更されたあらゆるオブジェクトの値は、不定になります。

マルチスレッドプログラムで signal が使用された場合、動作は未定義です。 スレッドセーフであることは要求されていません。

[編集] ノート

POSIX は、 signal がスレッドセーフであることを要求しており、任意のシグナルハンドラから呼ぶことができる非同期シグナルセーフなライブラリ関数の一覧を規定しています

abort および raise に加えて、 POSIX は killpthread_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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.14.1.1 The signal function (p: 266-267)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.14.1.1 The signal function (p: 247-248)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.7.1.1 The signal function

[編集] 関連項目

特定のシグナルに対するシグナルハンドラを実行します
(関数) [edit]