Perl Hackers Hub UNIXプログラミングの勘所(3)

シグナルに関するkazuhoさんの講義(http://gihyo.jp/dev/serial/01/perl-hackers-hub/000603)を読みつつ、分からない基本コンセプトを

Operating System Concepts

Operating System Concepts

で調べる。

シグナルとは

UNIXにおけるプロセス間通信(IPC)を実現するための方法の1つ。

"Operating System Concept"

A signal is used in UNIX systems to notify a process that a particular event has occurred.
Every signal has a default signal handler that is run by the kernel when handling that signal. This default action can be overridden by a user-defined signal handler that is called to handle the signal.

特定のイベントが発生したことをプロセスに通知するための仕組みで、どのシグナルもデフォルトのハンドラを持っている。デフォルトのシグナルハンドラはユーザがオーバライドできる。

いくつかシグナルを確かめてみる

SIGALRM

kazuhoさんの記事を参考に手軽そうなSIGALRMから。

$SIG{ALRM} = sub {
    warn 'timeout';
};

alarm 1; # 1秒後にSIGALRMをプロセスに送る

sleep 100;
print "end\n";

これで100秒を待たずにSIGALRMのハンドラが動作して、sleep 100;を抜けて"end\n"を出力してプロセスが終了する。

SIGTERM
print "$$\n";

local $SIG{TERM} = sub {
    warn 'SIGTERM';
    exit;
};

sleep 30;

killはデフォルトでSIGTERM(終了)を送るので、kill [ps id]とすればok。

SIGINT

SIGINT(割り込み)に限らないけど、シグナルを無視することも可能。

local $SIG{INT} = 'IGNORE';
sleep 30;

まとめ

ちょっとシグナルについてわかった(気がする)