シグナルを捕捉してみる

id:naoyaさんが紹介されていたこの本を読み始めました。Perlというより、ネットワークプログラミングの基礎がきっちり書いてあるので、ネットワークプログラミングの基礎が理解できていない自分にとっては、とても勉強になる書籍だと思います。


[rakuten:book:11121444:detail]


とはいえ、まだ第2章までしか読み進めていないのですが、、シグナルのところで出てきたサンプルを少しいじってみました。

Linuxコマンドライン標準入力から受け取ったINTシグナル(=Ctrl+C)とTSTPシグナル(=Ctrl+Z)を捕捉して、3回目まではガードして実行を続けます。

#!/usr/bin/perl

use strict;
use warnings;

$SIG{INT} = \&guard;
$SIG{TSTP} = \&guard;

my $counter =0;

while ( $counter <= 3 ) {
    print "--- I'm sleeping 3 sec. ---\n";
    sleep 3;
}

sub guard {
    my $signal = shift;
    $counter++;
    warn 'Guard from $SIG{',$signal,'} (',$counter,'/3)',"\n"
        if $counter <= 3;
}
__END__

結果は以下のような感じになります。

webmaster@KURO-BOX:~/work/20080117$ ./signal_test.pl
--- I'm sleeping 3 sec. ---
--- I'm sleeping 3 sec. ---
Guard from $SIG{INT} (1/3)
--- I'm sleeping 3 sec. ---
Guard from $SIG{TSTP} (2/3)
--- I'm sleeping 3 sec. ---
Guard from $SIG{INT} (3/3)
--- I'm sleeping 3 sec. ---
webmaster@KURO-BOX:~/work/20080117$