トップページ >  C >  シグナル
初版2011/03/11: 最終更新日2011/03/11
シグナル
目次
シグナル
SIGALRM
SIGUSR1とSIGUSR2
シグナル
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);
}