perl信号INT的问题

时间:2011-01-21 16:50:59

标签: perl

我在windows activestate perl 5.8上有以下perl代码

  $SIG{INT}=\&clean;

  ...
  sub clean {

  print 'cleaning...';
  ...
  ...
  exit 0;

  }

但是当我尝试通过Ctrl ^ c关闭我的程序时,它根本没有进入子清理可能有人帮助我为什么会错过什么?

3 个答案:

答案 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()”的大多数实现严重削弱。 ...

供将来参考:

  1. perlmonks指的是使用Win32::API来设置对SetConsoleCtrlHandler Win32函数的调用。
  2. 所有关于SetConsoleCtrlHandler