シグナル(Unix)の履歴

シグナル(signal)とは、UNIX系オペレーティングシステムにおいてプロセス間で非同期イベントの発生を伝える機構。

UNIX系およびPOSIX準拠のオペレーティングシステムでは、シグナルの種類と使用法が規定されている。

http://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29


通常のプログラムだと、 "Ctrl + z" で処理を中断、"fg"で処理を再開できるよ!

perlでシグナルをキャッチする


Ctrl + C でプログラムを終了するときにリソースを開放してやると良いのでなかろうか。

下のコードは Ctrl + c(割り込み), Ctrl + z(中断), Ctrl + \(終了)

#!/bin/perl

use strict;
use warnings;

my $flag = 1;
$| = 1;

$SIG{'STOP'} = sub {
    print "STOP!!\n";
};

$SIG{'TSTP'} = sub {
    print "TSTP!!\n";
# シグナルをキャッチしたままだと停止しないので、
# SIGSTOP(19)を送信しなおす
    kill(19, $$);   
};

$SIG{'CONT'} = sub {
    print "CONT\n";
};

$SIG{'INT'} = sub {
    print "KILLED\n";
    die;
};

# SIGQUIT は Ctrl + \ で発生します。
$SIG{'QUIT'} = sub {
    $flag = 0;
    print "BYE!!\n";
};

my $counter = 1;
while ($flag) {
    sleep 1;
    if ($counter % 5 == 0) {
        kill(20, $$);   # SIGTSTP(20) を送る
    }
    print ".";
    print $counter++;
}