次の方法で共有


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 はエラーを示します。その場合、errnoEINVAL に設定されます。

リターン コードの詳細については、「errno_doserrno_sys_errlist、および _sys_nerr」を参照してください。

解説

signal 関数を使用すると、プロセスで、オペレーティング システムからの割り込みシグナルを処理する複数の方法から 1 つの方法を選択できます。 sig 引数は、signal が応答する割り込みです。SIGNAL.H で定義されている次のマニフェスト定数のいずれかを指定する必要があります。

sig 説明
SIGABRT 異常終了
SIGFPE 浮動小数点エラー
SIGILL 無効な命令
SIGINT Ctrl + C シグナル
SIGSEGV ストレージへの無効なアクセス
SIGTERM 終了要求

sigが上記の値の 1 つでない場合は、パラメーター検証で定義されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、この関数は errnoEINVAL に設定し、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_xxxFLOAT.Hで定義された複数のマニフェスト定数の 1 つである省略可能な 2 番目の引数を受け取る関数を指します。 SIGFPEシグナルが発生した場合は、2 番目の引数の値をテストして浮動小数点例外の種類を判断し、適切なアクションを実行できます。 この引数とその有効な値は Microsoft 拡張機能です。

浮動小数点例外の場合、シグナルの受信時に func の値はリセットされません。 浮動小数点例外から回復するには、try/except 句で浮動小数点演算を囲みます。 setjmplongjmp を使用して回復することもできます。 いずれの場合も、呼び出し元プロセスは実行を再開し、プロセスの浮動小数点状態を未定義のままにします。

シグナル ハンドラーが戻った場合、呼び出し元のプロセスは、シグナルまたは動作モードの種類に関係なく、割り込みシグナルを受信した時点の直後に実行を再開します。

指定した関数が実行される前に、func の値は SIG_DFL に設定されます。 次の割り込みシグナルは、間に行われる SIG_DFL の呼び出しで特に指定されない限り、signal に関する説明のとおりに処理されます。 この機能を使用して、呼び出された関数でシグナルをリセットできます。

シグナル ハンドラー ルーチンは割り込みが発生したときに非同期的に呼び出されることが多いため、実行時操作が不完全で不明な状態のときに、シグナル ハンドラー関数が制御を受け取る場合があります。 次の一覧に、シグナル ハンドラー ルーチンで使用できる関数が決まる制限事項について説明します。

  • 低レベルまたは STDIO.H I/O ルーチン ( printffreadなど) を発行しないでください。

  • ヒープ ルーチンやヒープ ルーチンを使用するルーチン ( malloc_strdup_putenvなど) を呼び出さないでください。 詳細については、mallocを参照してください。

  • システム呼び出しを生成する関数 ( _getcwdtimeなど) は使用しないでください。

  • 割り込みが浮動小数点例外 (つまり、sigSIGFPE) によって発生する場合を除き、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 関数