signal() — 割り込みシグナルの処理

フォーマット

#include <signal.h>
void ( *signal (int sig, void(*func)(int)) )(int);

言語レベル

ANSI

スレッド・セーフ

はい

説明

signal() 関数を使用すると、プログラムは、 オペレーティング・システムまたは raise() 関数からの割り込みシグナルを処理するいくつかの方法のうち 1 つを選択できるようになります。 SYSIFCOPT(*ASYNCSIGNAL) オプションでコンパイルされた場合、この関数は非同期シグナルを使用します。 この関数の非同期バージョンは、sigaction() に SA_NODEFER および SA_RESETHAND オプションを指定した場合のように動作します。 非同期シグナル・ハンドラーは、abort()exit() を呼び出しません。 この関数についての残りの説明は、同期シグナルに関するものです。

sig 引数は、マクロ SIGABRTSIGALLSIGILLSIGINTSIGFPESIGIOSIGOTHERSIGSEGVSIGTERMSIGUSR1、または SIGUSR2 のいずれかでなければなりません。これらは、signal.h インクルード・ファイルに定義されています。SIGALLSIGIO、および SIGOTHER は、ILE C/C++ ランタイム・ライブラリーでのみサポートされています。func 引数は、<signal.h> インクルード・ファイルまたは関数アドレスに定義された、マクロ SIG_DFL または SIG_IGN のいずれかでなければなりません。

sig の値の意味は、以下のとおりです。
意味
SIGABRT
異常終了
SIGALL
現在の処理の処置が SIG_DFL であるシグナルに対するキャッチ・オール。

SYSIFCOPT(*ASYNCSIGNAL) が指定された場合、SIGALL はキャッチ・オール・シグナルではありません。 SIGALL のシグナル・ハンドラーは、ユーザー発信の SIGALL シグナルの場合にのみ呼び出されます。

SIGILL
無効な関数イメージの検出
SIGFPE
オーバーフロー、ゼロによる割り算、および無効な演算などの、マスクされない算術例外
SIGINT
対話式アテンション
SIGIO
レコード・ファイル入出力エラー
SIGOTHER
ILE C シグナル
SIGSEGV
無効なメモリーへのアクセス
SIGTERM
プログラムに送信された終了要求
SIGUSR1
ユーザー・アプリケーションによる使用目的 (ANSI への拡張)
SIGUSR2
ユーザー・アプリケーションによる使用目的 (ANSI への拡張)
割り込みシグナルが受信されたときに取られる処置は、func の値によって異なります。
意味
SIG_DFL
シグナルのデフォルト処理が行われます。
SIG_IGN
シグナルが無視されます。

戻り値

戻り値 SIG_ERR は、signal() への呼び出しでエラーが発生したことを示します。 正常に実行された場合、signal() への呼び出しは、func の最新の値を戻します。 errno の値は、EINVAL に設定されます (シグナルが無効です)。

この例では、シグナル・ハンドラーの設定方法を示します。
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#define  ONE_K  1024
#define OUT_OF_STORAGE       (SIGUSR1)
/* The SIGNAL macro does a signal() checking the return code */
#define SIGNAL(SIG, StrCln)       {                    \
  if (signal((SIG), (StrCln)) == SIG_ERR) {            ¥
    perror("Could not signal user signal");            ¥
    abort();                                           ¥
  }                                                    \
}
 
void StrCln(int);
void DoWork(char **, int);
 
int main(int argc, char *argv[]) {
  int size;
  char *buffer;
  SIGNAL(OUT_OF_STORAGE, StrCln);
  if (argc != 2) {
    printf("Syntax: %s size ¥n", argv[0]);
    return(-1);
  }
  size = atoi(argv[1]);
  DoWork(&buffer, size);
  return(0);
}
 
void StrCln(int SIG_TYPE) {
  printf("Failed trying to malloc storage¥n");
  SIGNAL(SIG_TYPE, SIG_DFL);
  exit(0);
}
 
void DoWork(char **buffer, int size) {
  int rc;
  *buffer = malloc(size*ONE_K);    /* get the size in number of K */
  if (*buffer == NULL) {
     if (raise(OUT_OF_STORAGE)) {
        perror("Could not raise user signal");
        abort();
     }
  }
  return;
}
/*  This is a program fragment and not a complete function example  */