Perl:将参数传递给信号处理程序会导致处理程序立即运行

时间:2014-02-26 09:18:58

标签: perl signals

简短版本:我正在尝试将参数传递给信号处理程序。但是,当我这样做时,处理程序会在程序启动后立即运行。为什么会发生这种情况,我该如何纠正呢?

详细信息:我的代码中有以下行:$SIG{ALRM} = \&timesup($number);。信号处理程序本身是:

sub timesup {
    my $num = shift;
    die "Time ran out.\nNumber was: $num\n"
}

当我运行程序时,它会立即运行信号处理程序并使用指定的消息终止。我通过在$SIG{ALRM}行之前生成$ number的随机值进行测试。关于死亡的天鹅歌曲消息确实打印了随机值,所以我认为论证本身正在正确传递。但输出是立竿见影的:

bassoon:$ ./myscript.pl

Time ran out.
Number was: 4

如果我拿走了论证并且只是$SIG{ALRM} = \&timesup;,那么程序就会按预期工作。但是,在这种情况下,我无法将参数传递给子例程,并且必须使用全局,我宁愿不这样做。

我做错了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:6)

\&timesup($number)调用timesup子(&timesup($number)),然后引用返回值(\)。应避免使用&调用sub,因为这会绕过原型并可能产生某些其他影响。

解决方案是将timesup应用程序包装成这样:

$SIG{ALRM} = sub { timesup($number) };

这实际上是partial application

答案 1 :(得分:-2)

您应该将信号处理程序设置为:$SIG{ALRM} = 'timesup'