C言語における信号処理
プログラムが異常に終了したり(セグメントエラーなど)、終了したり(CTRL+Cが押されたり)すると、動的に申請されたリソースが解放されない場合や、プログラムに保存などの他の処理が必要な操作がある場合があります.
C言語の標準ライブラリには、外部からの割り込み信号やプログラム実行中に発生したエラーなどのイベントを処理する処理プログラム実行中の異常を処理する機能がいくつか提供されている.
Signal()は、信号sigが後で現れる場合の処理方法を決定するために用いられる.handlerの値がSIG_の場合DFLは、定義されたデフォルトの動作を実装する.handlerの値がSIG_の場合IGNは、信号を無視する.そうでなければ、handlerが指す関数(パラメータは信号タイプ)を呼び出します.有効な信号は次のとおりです.
SIGABRT
abort()を呼び出すなどの異常終了.
SIGFPE
除数が0またはオーバーフローなどの演算エラー.
SIGILL
不正なコマンドなどの不正な関数マッピング.
SIGINT
割り込みなどのインタラクティブな信号.
SIGSEGV
存在しないメモリセルへのアクセスなど、メモリに不正アクセスします.
SIGTERM
本プログラムに送信される終了要求信号.
その後、信号sigが現れると、実行中の動作が中断され、信号処理関数(*handler)(sig)が実行される.信号処理プログラムから戻ると、中断した位置から実行が続行される.Signal()戻り信号sig元のhandler;エラーが発生した場合はSIG_に戻りますERR.
例:
1、除数0
出力:
2、プログラムはCTRL+Cによって終了される:
CTRL+Cを押して、出力:
C言語の標準ライブラリ
#include <signal.h>
void (*signal(int sig, void (*handler)(int)))(int);
Signal()は、信号sigが後で現れる場合の処理方法を決定するために用いられる.handlerの値がSIG_の場合DFLは、定義されたデフォルトの動作を実装する.handlerの値がSIG_の場合IGNは、信号を無視する.そうでなければ、handlerが指す関数(パラメータは信号タイプ)を呼び出します.有効な信号は次のとおりです.
SIGABRT
abort()を呼び出すなどの異常終了.
SIGFPE
除数が0またはオーバーフローなどの演算エラー.
SIGILL
不正なコマンドなどの不正な関数マッピング.
SIGINT
割り込みなどのインタラクティブな信号.
SIGSEGV
存在しないメモリセルへのアクセスなど、メモリに不正アクセスします.
SIGTERM
本プログラムに送信される終了要求信号.
その後、信号sigが現れると、実行中の動作が中断され、信号処理関数(*handler)(sig)が実行される.信号処理プログラムから戻ると、中断した位置から実行が続行される.Signal()戻り信号sig元のhandler;エラーが発生した場合はSIG_に戻りますERR.
例:
1、除数0
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void func(int sig)
{
printf("Signal deal!
");
printf("ERROR:Divisor is 0!
");
exit(0);
}
int main()
{
signal(SIGFPE,func);
printf("10/0=
",10/0);
return 0;
}
出力:
Signal deal!
ERROR:Divisor is 0!
2、プログラムはCTRL+Cによって終了される:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void func(int sig)
{
printf("Signal deal!
");
printf("Signal was stop by ctrl+c!
");
exit(0);
}
int main()
{
signal(SIGINT,func);
while(1){
sleep(1);
}
return 0;
}
CTRL+Cを押して、出力:
^CSignal deal!
Signal was stop by ctrl+c!