Cライブラリ関数 -signal()
説明
Cライブラリ関数void (*signal(int sig, void (*func)(int)))(int)シグナルを処理する関数を設定します。つまり、sigパラメータを持つシグナルハンドラ。
signalこの関数はC標準ライブラリ内の関数で、シグナルハンドラを設定するために使用されます。この関数は<signal.h>ヘッダファイル内で定義されています。signalこの関数を使用すると、プログラムは特定のシグナル(たとえばSIGINTCtrl+C を押すことで生成される)が届いたときに実行するハンドラを定義できます。
宣言
以下は signal() 関数の宣言です。
void (*signal(int sig, void (*func)(int)))(int);
パラメータ
- sig-- シグナルハンドラ内で変数として使用されるシグナルコード。以下は重要な標準シグナル定数です。
| 宏 | シグナル |
|---|---|
| SIGABRT | (Signal Abort) プログラムの異常終了。 |
| SIGFPE | (Signal Floating-Point Exception) 算術演算エラー。0による除算やオーバーフローなど(必ずしも浮動小数点演算とは限りません)。 |
| SIGILL | (Signal Illegal Instruction) 不正な関数イメージ(不正命令など)。通常はコード内の変種やデータの実行試行が原因です。 |
| SIGINT | (Signal Interrupt) 割り込みシグナル。ctrl-C など。通常はユーザーによって生成されます。 |
| SIGSEGV | (Signal Segmentation Violation) メモリへの不正アクセス。存在しないメモリ位置へのアクセスなど。 |
| SIGTERM | (Signal Terminate) このプログラムに送信される終了要求シグナル。 |
- func-- 関数へのポインタ。プログラム定義の関数か、以下の定義済み関数のいずれかです。
| SIG_DFL | デフォルトのシグナルハンドラ。 |
| SIG_IGN | シグナルを無視。 |
戻り値
この関数は、以前のシグナルハンドラの値を返します。エラーが発生した場合は SIG_ERR を返します。
例
以下の例は、signal() 関数の使い方を示しています。
例
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void sighandler(int);
int main()
{
signal(SIGINT, sighandler);
while(1)
{
printf("1秒間スリープを開始...\n"\n");
sleep(1);
}
return(0);
}
void sighandler(int signum)
{
printf("シグナル %d を捕捉、ループを抜ける...\n"\n", signum);
exit(1);
}
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void sighandler(int);
int main()
{
signal(SIGINT, sighandler);
while(1)
{
printf("1秒間スリープを開始...\n"\n");
sleep(1);
}
return(0);
}
void sighandler(int signum)
{
printf("シグナル %d を捕捉、ループを抜ける...\n"\n", signum);
exit(1);
}
上記のプログラムをコンパイルして実行してみましょう。次の結果が得られ、プログラムは無限ループに入るため、CTRL + C キーでプログラムを終了する必要があります。
开始休眠一秒钟... 开始休眠一秒钟... 开始休眠一秒钟... 开始休眠一秒钟... 开始休眠一秒钟... 捕获信号 2,跳出...その他の拡張
C標準ライブラリ - <signal.h>