名前空間
変種
操作

signal

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

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

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

目次

[編集] パラメータ

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

[編集] 戻り値

成功した場合は以前のシグナルハンドラ、失敗した場合はSIG_ERR(一部の実装ではシグナルハンドラの設定が無効になる場合があります)。

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

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

SIGFPESIGILL、またはSIGSEGVの処理中にユーザー定義関数が返された場合、動作は未定義です。

シグナルハンドラがabortまたはraiseの結果として呼び出された場合、シグナルハンドラがraiseを呼び出すと、動作は未定義です。

abortまたはraiseの結果としてシグナルハンドラが呼び出されなかった場合(つまり、シグナルハンドラが*非同期*である場合)、以下の場合は動作が未定義です。

  • シグナルハンドラが標準ライブラリ内の関数を呼び出す場合、ただし以下を除く。
  • abort
  • _Exit
  • quick_exit
  • 現在処理中のシグナルの番号を最初の引数とするsignal(非同期ハンドラは自身を再登録できますが、他のシグナルはできません)。
  • atomic引数がロックフリーである場合、`<stdatomic.h>`のatomic関数
  • atomic_is_lock_free(任意の種類のatomic引数を使用)
  • シグナルハンドラが、ロックフリーでないvolatile sig_atomic_tへの代入による場合を除き、静的またはスレッドローカル(C11以降)自動記憶域期間を持つオブジェクトを参照する場合(C11以降)(C11以降)

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

  • volatile sig_atomic_t型のオブジェクト
  • ロックフリーなアトミック型オブジェクト(C11以降)
  • atomic_signal_fenceを介して可視化された副作用(C11以降)

シグナルハンドラからの復帰時、シグナルハンドラによって変更されたオブジェクトの値で、volatile sig_atomic_tまたはロックフリーアトミック(C11以降)でないものは未定義です。

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

[編集] 注記

POSIXは、signalがスレッドセーフであることを要求しており、シグナルハンドラから呼び出し可能な非同期シグナルセーフなライブラリ関数のリストを指定しています。

abortraiseに加えて、POSIXはkillpthread_killsigqueueが同期シグナルを生成すると指定しています。

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

[編集] 参照

  • C17標準 (ISO/IEC 9899:2018)
  • 7.14.1.1 The signal function (p: 193-194)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.14.1.1 The signal function (p: 266-267)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.14.1.1 The signal function (p: 247-248)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.7.1.1 The signal function

[編集] 関連項目

特定のシグナルに対してシグナルハンドラを実行する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)