为什么使用这个简单的脚本:
#! 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";
) 执行相同的操作,窗口将关闭但不会执行干净退出)
(好吧,我承认它是为 Windows 7 amd64 -vs- 上的 MSWin32-x86-multi-thread
构建的 Strawberry perl 5,版本 14,subversion 2 (v5.14.2) perl,v5.10.1 (*) 为 x86_64-linux-gnu-thread-multi
在 Debian 6.0.4 机器上构建,但我怀疑它对这些基本的东西是否重要。编辑:我刚刚用 ActiveState perl 5.12 在类似的盒子上检查了它,它是一样的,所以显然这个问题并不孤立于 Strawberry。)
我知道perlport说的很清楚,
Don't count on signals or %SIG for anything.
但必须有办法......(另外,我想明白。)
那么应该采取哪些不同的做法呢?
最佳答案
您可以使用 sigtrap
用法:
use sigtrap 'handler', \&cleanup, 'normal-signals';
当捕获到信号并将信号标识作为参数传递时,这将调用方法 cleanup
。
关于windows - 在 Windows 上捕获 SIGINT(和其他信号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912113/