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 引数は、マクロ SIGABRT、SIGALL、SIGILL、SIGINT、SIGFPE、SIGIO、SIGOTHER、SIGSEGV、SIGTERM、SIGUSR1、または SIGUSR2 のいずれかでなければなりません。これらは、signal.h インクルード・ファイルに定義されています。SIGALL、SIGIO、および SIGOTHER は、ILE C/C++ ランタイム・ライブラリーでのみサポートされています。func 引数は、<signal.h> インクルード・ファイルまたは関数アドレスに定義された、マクロ SIG_DFL または SIG_IGN のいずれかでなければなりません。
- 値
- 意味
- SIGABRT
- 異常終了
- SIGALL
- 現在の処理の処置が SIG_DFL であるシグナルに対するキャッチ・オール。
SYSIFCOPT(*ASYNCSIGNAL) が指定された場合、SIGALL はキャッチ・オール・シグナルではありません。 SIGALL のシグナル・ハンドラーは、ユーザー発信の SIGALL シグナルの場合にのみ呼び出されます。
- SIGILL
- 無効な関数イメージの検出
- SIGFPE
- オーバーフロー、ゼロによる割り算、および無効な演算などの、マスクされない算術例外
- SIGINT
- 対話式アテンション
- SIGIO
- レコード・ファイル入出力エラー
- SIGOTHER
- ILE C シグナル
- SIGSEGV
- 無効なメモリーへのアクセス
- SIGTERM
- プログラムに送信された終了要求
- SIGUSR1
- ユーザー・アプリケーションによる使用目的 (ANSI への拡張)
- SIGUSR2
- ユーザー・アプリケーションによる使用目的 (ANSI への拡張)
- 値
- 意味
- 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 */
関連情報
- abort() — プログラムの停止
- atexit() — プログラム終了の記録関数
- exit() — プログラムの終了
- raise() — シグナルの送信
- <signal.h >
- Information Center のトピック『API』内の signal() API。