なぜこの単純なスクリプト:
#! perl -w
use strict;
use warnings;
$| = 1;
my $LOCKFILE = "$0.lock";
sub mklock {
open my $lf, ">", $LOCKFILE;
print $lf $$;
close $lf;
}
sub rmlock { unlink $LOCKFILE; }
sub clean_exit { rmlock; exit 0; }
sub work {
print "working...";
sleep 10;
# although `sleep 1 foreach (1..10);`
# *does* interrupt---between `sleep`s--see my answer
print "done.\n"
}
$SIG{INT} = "clean_exit";
mklock;
work;
rmlock;
Debianで動作しますが、Windowsでは動作しませんか?
- Windowsでは、このスクリプトが機能している場合、Ctrl+Cは無視されます
- Debianでは、クリーンな終了が期待どおりに実行されます
- を使用する
$SIG{INT} = \&clean_exit;
と、動作は同じように見えます SIGHUP
( ( )で同じことをすると$SIG{HUP} = "clean_exit";
、ウィンドウは閉じられますが、とにかくクリーンな終了は実行されません)
(まあ、それperl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x86-multi-thread
はWindows 7のStrawberryとDebian6.0.4perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
ボックスのamd64-vs-であることを認めますが、そのような基本的なものにとって重要ではないかと思います。編集: ActiveState perl 5.12の同様のボックスでチェックしたところ、同じです。 、そのため、問題はStrawberryに限定されていないようです。)
perlportがそれを明確に言っていることを私は知っています、
シグナルや%SIGを当てにしないでください。
しかし、方法があるに違いありません...(さらに、私は理解したいと思います。)
では、別の方法で何をすべきでしょうか?