3

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

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”在空操作中不是数字。

我在谷歌上搜索过,但没有找到任何处理这种行为的东西。

有人可以对此有所了解吗?

非常感谢您的帮助

此致

弗洛朗

#

感谢四位您的回复,这里是 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;

这可能很重要,也可能不重要:)希望这有帮助:)

再次感谢您的回复和帮助

此致

弗洛朗

4

1 回答 1

0

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

它是 perlsub 中描述的特性的一种表达方式:

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

如果有记忆,您应该可以通过更改来修复它:

local $SIG{HUP} = \&StopSuperviser;

local $SIG{HUP} = sub { StopSuperviser() };
于 2012-11-20T21:49:38.260 回答