全局销毁期间的SIG错误

时间:2012-11-07 22:46:29

标签: perl signals runtime-error

我对我创建的脚本有疑问。这是我第一次使用信号,因为我希望我的脚本像守护进程一样运行,所以我设置了几个信号Handler来正确结束我的脚本:

local $SIG{HUP} = \&StopSuperviser;
local $SIG{INT} = \&StopSuperviser;
local $SIG{QUIT} = \&StopSuperviser;
local $SIG{ILL} = \&StopSuperviser;
local $SIG{ABRT} = \&StopSuperviser;
local $SIG{TERM} = \&StopSuperviser;

这是正常工作但是当我将其中一个信号发送到我的脚本(Crt-C,kill -15,kill -1 ...)时,StopSuperviser函数被正确调用但我总是在我的脚本中收到以下错误输出:

  

参数“HUP”在全局销毁期间在空操作中不是数字。

我在google上搜索过,但我没有找到任何处理此行为的内容。

愿有人对此有所了解吗?

非常感谢你的帮助

最好的问候

Florent的

感谢你的回复,这里是StopSuperviser功能:

sub StopSuperviser
{
    print "On quite\n";
    $StopAlarm = 1;
    &DeleteThreadOrder($AllProcess);
    foreach my $Subprocess (@$AllProcess) {
        foreach my $thread (@{$Subprocess->{Thread}}) {
            $thread->kill('USR1');
            $thread->join();
        }
    }
    exit;
}

我也使用以下包:

use Alarm::Concurrent;

这可能很重要,或者可能不是:) 希望这有帮助:)

再次感谢您的回复和帮助

最好的问候

Florent的

1 个答案:

答案 0 :(得分:0)

今年早些时候我遇到了这个问题,最终在PerlMonks上找到了解决方案,但我现在找不到链接了。如果我碰到它,我会更新。他们的解释比我在这里提出的要详细得多。

它是perlsub中描述的一个特征的表达式:

  

如果使用&形式,参数列表是   可选,如果省略,则不为子例程设置@_数组:   调用时的@_数组对子程序可见。

如果内存有效,您应该可以通过更改:

来修复它
local $SIG{HUP} = \&StopSuperviser;

local $SIG{HUP} = sub { StopSuperviser() };