我在windows activestate perl 5.8上有以下perl代码
$SIG{INT}=\&clean;
...
sub clean {
print 'cleaning...';
...
...
exit 0;
}
但是当我尝试通过Ctrl ^ c关闭我的程序时,它根本没有进入子清理可能有人帮助我为什么会错过什么?
答案 0 :(得分:3)
似乎Windows不像Unix那样提供信号。
来自man perlwin32
:
信号处理可能不像在Unix平台上那样(它没有 完全“表现”,要么:)。例如,调用“die()”或“exit()” 从大多数实现开始,信号处理程序将导致异常 Win32上的“signal()”严重瘫痪。因此,信号可以 仅适用于在处理程序中设置标志变量等简单操作。 目前应考虑使用此端口下的信号 不支持的。
答案 1 :(得分:1)
我会说不。我看不出你在做什么有什么问题。我写了一个实际运行的测试程序:
#!/usr/bin/perl
use strict;
use warnings;
$SIG{INT}=\&clean;
sub clean {
print 'caught';
}
sleep 10;
在Linux上测试过,这可以按预期工作,但我没有AS perl方便尝试。在你的机器上自己试试。
此外,打印到STDERR以确保打印缓冲不是很奇怪。
答案 2 :(得分:0)
我发现@ijw给出的脚本(修改为下面的内容)在Active State Perl v5.10.1版下不起作用:
This is perl, v5.10.1 built for MSWin32-x86-multi-thread
(with 2 registered patches, see perl -V for more detail)
我在下面的修改添加了autoflush调用(否则就是睡眠 下面不会显示print语句输出 睡觉):
#!/usr/bin/perl
use IO;
use strict;
use warnings;
# Set autoflushing on to stdout and stderr. Otherwise, system() call and stdout output does not show up in proper sequence,
# especially on Windows:
STDOUT->autoflush(1);
STDERR->autoflush(1);
$SIG{INT}=\&clean;
sub clean {
print "caught\n";
exit (0);
}
print "before sleep\n";
sleep 100;
print "after sleep and then exiting\n";
exit (0);
当我在上面的脚本中注释掉以下几行时:
$SIG{INT}=\&clean;
sub clean {
print "caught\n";
exit (0);
}
然后在睡眠期间点击CTRL-C,脚本会终止并显示以下消息:
Terminating on signal SIGINT(2)
因此,实际上它必须是真的(对于ActiveState Perl v5.10.1)man perlwin32
指出的是什么:
... Win32上“signal()”的大多数实现严重削弱。 ...
供将来参考:
SetConsoleCtrlHandler
Win32函数的调用。