perlでのsignal処理

$SIG で対応。

ループをCtrl-Cで抜ける場合、SIGINTが送られますので、$SIG{INT} に無名サブルーチンをセットすればOK。

プログラムは、こんなかんじになります。

#!/usr/bin/perl

@nonosirare = ( 
                "くず",
                "ばーか",
                "すけべ",
                "ばか",
                "しんじらんない",
                "あ゛ん?",
                "おたんこなす",
                "だいっきらい",
                "いいかげんにしたら",
                "モジモジしてキモイねー",
                "はげろ",
                "なにえらそうなこといってんの",
                "でてって",
                "くず",
                "むしんけー",
                "は?",
    );

local $SIG{INT} = sub { $l = 0; };         # localはなくても大丈夫?

$c = 0 ;
$l = 1 ;
while($l)
{
    $j = $nonosirare[ int(rand($#nonosirare + 1)) ] ;
    print $j ;
    $c ++ ;
}

print "\n\n" ;
printf( "%d回罵られました。ありがとうございます。\n" , $c);

実行し、Ctrl-CしてSIGINTを送ったり、kill -INT (pid) してSIGINTを送ったりすると、ループから抜けてループを回した回数が表示されます。
一番下に回数が出てる

Comments are closed.