2007年6月15日

sleep は、SIGALRM で解除できる。

最近、daemontools を利用した、perl プログラムを、以下のように書いている
my $END_FLG = 0;
$SIG{HUP} = $SIG{TERM} = sub {
$END_FLG = 1;
};

while (sleep 60) {
# ... bla bla bla ...
exit if $END_FLG;
}
っで、SIGHUP とか SIGTERM とかが来たら、安全な場所で、プログラム停止ができるように組み込んだ、あと、調べて分かった事が、ひとつふたつあるので紹介。SIGKILL は、捕捉したり無視したりできないという事がわかった、それと、SIGSTOP も同じという事が発覚した、、。
参考:perlドキュメント日本語訳 - Perlのプロセス間通信#Signals
そこで、SIGSTOP が捕捉できないって事は、例えば、他サーバーと通信中に SIGSTOP とか受信したら、どうなるんだ??通信相手には、STOP なんて知らせて無いのに強制停止、この時、返答が来たらどうなるの??それに、通信中に停止すると、何も通信が無くなるから途中で、コネクションが強制切断されたりする可能性があるし、かなり困るなぁ、、、SIGSTOP が捕捉できないというのは、仕様としてどうなのだろう、、、??

それと、タイトルの件だけど、sleep が SIGALRM で再開できるってのは、師匠の話によると、alarm を使って、sleep が実装されているとの事、なるほどぉ~!

っで、ふと思ったのだけど、上記に書いた実装方法だと、おそらくだけど、sleep に入って、1秒経過する前に SIGALRM を受信してしまうと、ループから抜けてしまう気がする、、。。

0 件のコメント: