Signal2006年09月29日 10時28分49秒

久ぶりにシグナルを扱おうとしたら、ずいぶん忘れていたので、メモ。

ごく単純なシグナルハンドラ。シグナルを受けたのを表示したかっただけだが、折角なので捻りも加えて。


% cat signal.c
#include 
#include 

static volatile long long i;

void handler(int sig)
{
        fprintf(stderr, "signal %d -> %lld\n", sig, i);
}

int main()
{
        signal(SIGINT, handler); /* ctrl-C */
        while(1) i++;
}
% make signal
cc -O2 -fno-strict-aliasing -pipe   signal.c  -o signal
% ./signal
^Csignal 2 -> 225502701
^Csignal 2 -> 304306455
^Csignal 2 -> 374875222
^Csignal 2 -> 554400324
Terminated

Ctrl-C のシグナルで、広域変数 i の値を表示。初期設定のシグナルハンドラとは違い、プログラムを終了しないので、他から kill を使って強制終了させる必要がある。


% sed -i "" -e 's/volatile//' signal.c
% make signal
cc -O2 -fno-strict-aliasing -pipe   signal.c  -o signal
% ./signal
^Csignal 2 -> 0
^Csignal 2 -> 0
^Csignal 2 -> 0
^Csignal 2 -> 0
Terminated

volatile を取ると、この様な結果になる。なぜだか分からなければ、法政大学奥山研究室 17.2. volatile で復習。