次の方法で共有


signal

セットの割り込み通知を処理する。

重要 : 重要

テストのまたはデバッグ シナリオを除外 Windows ストア、アプリケーションを終了するには、このメソッドを使用しないでください。Windows ストア アプリケーションを閉じるプログラムまたは UI の方法は、の Windows 8 のアプリケーションの要件の検証セクション 3.6 に従って許可されていません。詳細については、アプリケーションの有効期間 (Windows ストア apps)" "を参照してください。

void (__cdecl *signal(
   int sig, 
   void (__cdecl *func ) (int [, int ] ))) 
   (int);

パラメーター

  • sig
    値を通知します。

  • func
    実行される関数。最初のパラメーターはシグナルの値であり、2 番目のパラメーターは、最初のパラメーターが SIGFPE ときに使用できるサブ コードです。

戻り値

signal は、特定の通知と func の以前の値を関連付ける返します。たとえば、func の以前の値が SIG_IGN、戻り値も SIG_IGNです。SIG_ERR の戻り値は errno が EINVALに設定すると、エラーを示します。

戻り値の詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。

解説

signal の関数は、プロセスがオペレーティング システムからの割り込み通知を処理するさまざまな方法の 1 種類を選択できます。sig の引数は signal が応答割り込み;。SIGNAL.H.で定義された次のマニフェスト定数の 1 時があります。

sig の値

説明

SIGABRT

異常終了

SIGFPE

浮動小数点エラー

SIGILL

命令はできません

SIGINT

シグナル Ctrl + C

SIGSEGV

無効なストレージのアクセス

SIGTERM

終了要求

sig が上記の値の 1 つがでない場合、無効なパラメーター ハンドラーが パラメーターの検証 で定義されたかのように、開始されます。実行の継続が許可 EINVAL へのこの関数のセット errno は SIG_ERRを返します。

既定では、signal は sigの値にかかわらず終了コード 3 の呼び出しプログラムが終了します。

[!メモ]

SIGINT は、すべての Win32 アプリケーションではサポートされません。Ctrl + C の割り込みが発生すると、Win32 オペレーティング システムは、その割り込みを処理する新しいスレッドが生成されます。これにより、UNIX で予期しない動作により、マルチスレッドの 1 種類のようなシングルスレッド アプリケーションが発生することがあります。

func の引数は、書き込み、または定義済みの定数 SIG_DFL か SIG_IGNの 1 つが、SIGNAL.H.でも定義されて通知のハンドラーのアドレスです。func が関数の場合は、特定の通知の通知のハンドラーとしてインストールされます。通知ハンドラーのプロトタイプは 1 種類の仮引数、型 intの sigが必要です。オペレーティング システムは sig によって割り込みが発生したときに実際の引数を指定します; 引数が割り込みを生成するシグナルです。したがって、割り込みが判断するためのイベントのハンドラー内の 6 種類の記号定数 (上の表に示した使用) 発生し、適切なアクションまたはを受け取ります。たとえば、2 台の通知に同じハンドラーを再配置するには signal を回呼び出すと、受け取った通知に基づいて異なるアクションを実行するには、ハンドラー内の sig の引数をテストします。

浮動小数点例外 (SIGFPE) をテストする場合、フォーム FPE_xxxの FLOAT.H に複数の記号定数の 1 つが定義しているオプションの 2 番目の引数を受け取る関数への func のポインター。SIGFPE 通知が表示されると、浮動小数点例外の型を決定し、適切なアクションを実行するための 2 番目の引数の値をテストできます。この引数として使用できる値は Microsoft の拡張機能です。

浮動小数点例外の場合、func の値は、通知を受信したときにリセットされません。浮動小数点例外からは回復するには、浮動小数点演算を囲む句を解除しようとを使用します。longjmp[setjmp] を使用して回復することもできます。いずれの場合も、呼び出し元のプロセスは undefined プロセス左の浮動小数点状態で実行を再開します。

シグナルのハンドラーがを返した場合、呼び出し元プロセスが割り込み通知を受信した位置の直後に実行を再開します。これは、シグナルまたは動作モードの場合も同様です。

指定した関数が実行される前に、func の値は SIG_DFLに設定されます。次の割り込みシグナルで SIG_DFLで説明されているように signal に対する中間の呼び出しが特に指定しない限り、扱われます。この機能は、呼び出された関数の変更通知できます。

割り込みが発生すると通知ハンドラー ルーチンは、通常、非同期的に呼び出されるため、通知ハンドラー関数は、ランタイムの動作が不完全な、不明な状態にあるとコントロールを派生させる場合があります。リストは以下のすべての関数を使用して通知ハンドラー ルーチンで使用できるかを制限を示します。

  • 低レベルまたは STDIO.H I/O ルーチンを実行 printf と fread (など)。

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

  • システム コール (たとえば、_getcwd、time) を生成する関数を使用しないでください。

  • 割り込みが浮動小数点例外によって引き起こされなかったら longjmp を使用しないようにします (つまり、sig は SIGFPEです)。この場合、最初に _fpresetに呼び出しでパッケージを浮動小数点の再初期化します。

  • オーバーレイ ルーチンを使用しないでください。

プログラムは、関数の SIGFPE の例外をトラップする場合は浮動小数点コードを含める必要があります。プログラムで浮動小数点コードがないので、ランタイム ライブラリのシグナル処理コードを必要としない場合は、揮発性二重を宣言し、ゼロに初期化:

volatile double d = 0.0f; 

SIGILL と SIGTERM シグナルで Windows 上の生成されません。これらは ANSI 互換性のために用意されています。したがって signalのこれらの通知の通知のハンドラーを設定または を呼び出して明示的にこれらの通知を生成できます。

シグナル設定は _exec または _spawn の関数の呼び出しで作成された子プロセスでは保持されません。シグナル設定は、新しいプロセスでは既定値にリセットされます。

必要条件

ルーチン

必須ヘッダー

signal

<signal.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

次の例では signal の使用を SIGABRT 通知にカスタム動作を追加する示します。中止の動作の詳細については、_set_abort_behaviorを参照してください。

// crt_signal.c
// compile with: /c
// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    
    abort();
}
  
  
  

同等の .NET Framework 関数

該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

関連項目

プロセス制御と環境制御

abort

_exec、_wexec 系関数

exit、_exit

_fpreset

_spawn 系関数と _wspawn 系関数