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 で復習。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2006/09/29/541829/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。