Namespaces
Variants

signal

From cppreference.net
ヘッダーで定義 <signal.h>
void ( * signal ( int sig, void ( * handler ) ( int ) ) ) ( int ) ;

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

シグナルハンドラが関数に設定され、シグナルが発生した場合、 signal ( sig, SIG_DFL ) がシグナルハンドラの開始直前に実行されるかどうかは実装定義である。また、実装はシグナルハンドラの実行中に、実装定義の一部のシグナルセットの発生を防止することができる。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters、Return value、Signal handler、Notes、Example、References、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDはすべて変更せず保持しました - 番号部分(tocnumber)はそのまま保持しました - フォーマットと構造は完全に維持しました

パラメータ

sig - シグナルハンドラを設定するシグナル。実装定義の値または以下のいずれかの値を指定できます:
シグナル種別を定義する
(マクロ定数)
handler - シグナルハンドラ。以下のいずれかを指定する必要があります:
  • SIG_DFL マクロ。シグナルハンドラがデフォルトのシグナルハンドラに設定されます。
  • SIG_IGN マクロ。シグナルが無視されます。
  • 関数へのポインタ。関数のシグネチャは以下と同等である必要があります:
void fun ( int sig ) ;

戻り値

成功時は前のシグナルハンドラ、失敗時は 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関数

関連項目

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