为什么需要这个简单的脚本:
#! 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";
),窗口将关闭,但无论如何都不会执行干净的退出)
(好吧,我承认这是Strawberry perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x86-multi-thread
在Windows 7 amd64上 -vs- perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
在Debian 6.0.4箱子上,但我怀疑对于这种基本的东西来说并不重要。 编辑:我刚刚在安装了ActiveState perl 5.12的类似机器上检查了它,结果是一样的,所以显然问题并不仅限于Strawberry。)
我知道perlport已经说得很清楚了,
不要指望信号或 %SIG 能做任何事情。
但肯定有办法... (而且,我想理解。)
那么应该怎样做才能有所不同呢?