사용자 인터럽트 가로채기

전종필

프로그램의 진행중에는 데이터 입출력이나, 통신의 한 세션과 같이 사용자의 인터럽트(Ctrl-C를 누르는 것)를 받지 않았으면 하는 일들이 많습니다. 그러나 사용자는 항상 프로그램이 끝나기를 기다려 주지 않으므로, 프로그램은 그런 상황을 우아하게 처리하고 싶을 것입니다. C/C++언에에서는 signal함수로 처리하지만, Perl에서는 %SIG 해쉬를 통해서 처리합니다.

#!/usr/bin/perl
$| = 1;
my $start = time;
my $end;
$SIG{INT} = sub {
        $end = time;
        my $diff = $end - $start;
        die "\nElapsed time : $diff seconds. Aborting.\n";
};

my $cnt=0;
while(1) {
        do_goodthing();
        $cnt++;
        if( $cnt == 50 ) {
                print "\n";
                $cnt = 0;
        }
        sleep 1;
}

sub do_goodthing {
        print '.';
}
위 프로그램을 직접 실행하고, Ctrl-C 키를 눌러서 반응을 보시기 바랍니다.
핵심은 $SIG{INT}에 인터럽트를 처리할 핸들러 서브루틴의 리퍼런스를 저장하는 것입니다. 그러면, Ctrl-C가 눌려질 때, 그 핸들러가 실행이 됩니다. 만일 Ctrl-C가 눌려질 때, 적당한 청소작업이 이루어진 후 프로그램을 종료하려 한다면, 반드시 die나 exit 등을 통해 프로그램이 종료되도록 명시하셔야만 합니다. 
Comments