シグナル
signal関数はシグナルが発生(例えばCtrl + cなど)した時に、そのシグナルを受信して何か処理を行う関数です。
第一引数にシグナルを指定し、第二引数にはそのシグナルを受信した時に行う関数かSIG_IGNなどを指定します。
signal関数はsignal.hをインクルードする必要があり、SIG_IGNはsignal.hに定義されています。
例えば
signal(SIGPIPE,SIG_IGN);
は、SIGPIPEシグナルが発生した時にそのシグナルを無視すると言う意味です。
SIG_IGNは第一引数で指定したシグナルを無視します。
SIG_PIPEはソケットにwriteやsendしようとした際に接続先がcloseしている場合に発生するシグナルです。
この時、デフォルトではプロセスは強制終了されます。
強制終了を防ぐためにはwriteやsendする前に
signal(SIGPIPE,SIG_IGN);
を記述します。
SIGALRM
SIGALRMはシグナルの一つで、タイマー割り込みを表します。
alarm関数で指定した秒の後にSIGALRMが発生します。
signal関数では第二引数に関数を登録することも出来ます。
以下は2秒後にSIGALRMを発生させ、その時の動作として関数呼び出しを行っている例です。
#include
#include
void test();
main(){
signal(SIGALRM,test);
alarm(2);
sleep(5);
printf("a¥n");
}
void test(){
printf("b¥n");
}
出力結果は以下のようになります。
b
a
SIGUSR1とSIGUSR2
SIGUSR1とSIGUSR2というシグナルはアプリケーションで自由に使えます。
このシグナルを送るには
kill -s SIGUSR1 プロセスID
と実行します。例えば、以下はSIGUSR1にtest関数というのを登録し、シグナルが送られるまでループするプログラムです。
#include <stdio.h>
#include <signal.h>
void test();
main(){
signal(SIGUSR1,test);
while(1){
sleep(1);
printf("a¥n");
}
}
void test(){
printf("end¥n");
exit(0);
}