signal
割り込みシグナル処理を設定します。
重要
テストやデバッグのシナリオの場合を除き、この方法を使用して Microsoft Store アプリをシャットダウンしないでください。 プログラムまたは UI を使用して Store アプリを閉じる方法は、Microsoft Store ポリシーでは許可されていません。 詳細については、UWP アプリのライフサイクルに関するページを参照してください。
構文
void __cdecl *signal(int sig, int (*func)(int, int));
パラメーター
sig
シグナル値。
func
2 番目のパラメーターは、実行する関数へのポインターです。 最初のパラメーターはシグナル値であり、2 番目のパラメーターは、最初のパラメーターが SIGFPE
されるときに使用できるサブコードです。
戻り値
signal
は、指定されたシグナルに関連付けられている func の前の値を返します。 たとえば、func
の前の値が SIG_IGN
の場合、戻り値も SIG_IGN
になります。 戻り値 SIG_ERR
はエラーを示します。その場合、errno
は EINVAL
に設定されます。
リターン コードの詳細については、「errno
、_doserrno
、_sys_errlist
、および _sys_nerr
」を参照してください。
解説
signal
関数を使用すると、プロセスで、オペレーティング システムからの割り込みシグナルを処理する複数の方法から 1 つの方法を選択できます。 sig
引数は、signal
が応答する割り込みです。SIGNAL.H
で定義されている次のマニフェスト定数のいずれかを指定する必要があります。
sig 値 |
説明 |
---|---|
SIGABRT |
異常終了 |
SIGFPE |
浮動小数点エラー |
SIGILL |
無効な命令 |
SIGINT |
Ctrl + C シグナル |
SIGSEGV |
ストレージへの無効なアクセス |
SIGTERM |
終了要求 |
sig
が上記の値の 1 つでない場合は、パラメーター検証で定義されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、この関数は errno
を EINVAL
に設定し、SIG_ERR
を返します。
既定では、signal
は、sig
の値に関係なく、終了コード 3 で呼び出し元のプログラムを終了します。
Note
SIGINT
はすべての Win32 アプリケーションでサポートされていません。 Ctrl + C 割り込みが発生すると、Win32 オペレーティング システムは、その割り込みを処理する専用の新しいスレッドを生成します。 これにより、UNIX のアプリケーションなどのシングル スレッド アプリケーションがマルチスレッドになり、予期しない動作が発生する可能性があります。
func
引数は、書き込むシグナル ハンドラーへのアドレス、または SIGNAL.H でも定義されている定義済みの署名アクション定数 SIG_DFL
またはSIG_IGN
のいずれかへのアドレスです。 func
が関数の場合は、指定されたシグナルのシグナル ハンドラーとしてインストールされます。 シグナル ハンドラーのプロトタイプには、sig
型の 1 つの仮引数 int
が必要です。 オペレーティング システムは、割り込みが発生したときに sig
を使用して実引数を渡します。引数は、割り込みを生成したシグナルです。 したがって、シグナル ハンドラーで (前の表の) 6 つのマニフェスト定数を使用して、発生した割り込みを特定し、適切なアクションを実行できます。 たとえば、signal
を 2 回呼び出して同じハンドラーを 2 つの異なるシグナルに割り当てた後で、そのハンドラーの sig
引数をテストすることで、受け取ったシグナルに基づいて異なるアクションを実行できます。
浮動小数点例外 (SIGFPE
) をテストする場合、func
は、フォーム FPE_xxx
のFLOAT.H
で定義された複数のマニフェスト定数の 1 つである省略可能な 2 番目の引数を受け取る関数を指します。 SIGFPE
シグナルが発生した場合は、2 番目の引数の値をテストして浮動小数点例外の種類を判断し、適切なアクションを実行できます。 この引数とその有効な値は Microsoft 拡張機能です。
浮動小数点例外の場合、シグナルの受信時に func
の値はリセットされません。 浮動小数点例外から回復するには、try/except 句で浮動小数点演算を囲みます。 setjmp
と longjmp
を使用して回復することもできます。 いずれの場合も、呼び出し元プロセスは実行を再開し、プロセスの浮動小数点状態を未定義のままにします。
シグナル ハンドラーが戻った場合、呼び出し元のプロセスは、シグナルまたは動作モードの種類に関係なく、割り込みシグナルを受信した時点の直後に実行を再開します。
指定した関数が実行される前に、func
の値は SIG_DFL
に設定されます。 次の割り込みシグナルは、間に行われる SIG_DFL
の呼び出しで特に指定されない限り、signal
に関する説明のとおりに処理されます。 この機能を使用して、呼び出された関数でシグナルをリセットできます。
シグナル ハンドラー ルーチンは割り込みが発生したときに非同期的に呼び出されることが多いため、実行時操作が不完全で不明な状態のときに、シグナル ハンドラー関数が制御を受け取る場合があります。 次の一覧に、シグナル ハンドラー ルーチンで使用できる関数が決まる制限事項について説明します。
低レベルまたは
STDIO.H
I/O ルーチン (printf
やfread
など) を発行しないでください。ヒープ ルーチンやヒープ ルーチンを使用するルーチン (
malloc
、_strdup
、_putenv
など) を呼び出さないでください。 詳細については、malloc
を参照してください。システム呼び出しを生成する関数 (
_getcwd
やtime
など) は使用しないでください。割り込みが浮動小数点例外 (つまり、
sig
がSIGFPE
) によって発生する場合を除き、longjmp
を使用しないでください。 この場合、最初に_fpreset
への呼び出しを使用して浮動小数点パッケージを再初期化します。オーバーレイ ルーチンは使用しないでください。
関数を使用して SIGFPE
例外をトラップする場合は、プログラムに浮動小数点コードを含める必要があります。 プログラムに浮動小数点コードがないため、ランタイム ライブラリのシグナル処理コードが必要な場合は、volatile double を宣言してゼロに初期化するだけです。
volatile double d = 0.0f;
SIGILL
信号とSIGTERM
信号は Windows では生成されません。 これらは ANSI 互換性のために含まれています。 したがって、signal
を使用してこれらのシグナルのシグナル ハンドラーを設定できます。また、raise
を呼び出してこれらのシグナルを明示的に生成することもできます。
シグナル設定は、 _exec
または _spawn
関数の呼び出しによって作成される生成されたプロセスでは保持されません。 シグナル設定は、新しいプロセスでは既定値にリセットされます。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
signal |
<signal.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
次の例は、signal
を使用してカスタム動作を SIGABRT
シグナルに追加する方法を示しています。 中止動作の詳細については、「 _set_abort_behavior
」を参照してください。
// crt_signal.c
// compile with: /EHsc /W4
// Use signal to attach a signal handler to the abort routine
#include <stdlib.h>
#include <signal.h>
void SignalHandler(int signal)
{
if (signal == SIGABRT) {
// abort signal handler code
} else {
// ...
}
}
int main()
{
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
previousHandler = signal(SIGABRT, SignalHandler);
abort();
}
出力は、使用されているランタイムのバージョン、アプリがコンソールであるか Windows アプリであるか、および Windows のレジストリ設定によって異なります。 コンソール アプリの場合、次のようなメッセージが stderr に送信される可能性があります。
Debug Error!
Program: c:\Projects\crt_signal\Debug\crt_signal.exe
R6010
- abort() has been called
関連項目
プロセスと環境の制御
abort
_exec
、_wexec
関数
exit
、 _Exit
、 _exit
_fpreset
_spawn
、_wspawn
関数