2012-11-07 59 views
3

我创建的脚本存在问题。这是我第一次使用的信号,因为我想我的脚本就像一个后台进程运行,所以我设置几个信号处理程序,要正确结束我的脚本:全球破坏期间的SIG错误

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”isn'全局销毁期间的空操作中的数字。

我已经在谷歌搜索,但没有找到任何处理这种行为。

有人可能会在这个?

非常感谢你的帮助

问候

弗洛朗

感谢Four的答复,这里是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; 

这可能重要的是知道,也可能不会再

谢谢:) 希望这有助于:)您回应并帮助

问候

弗洛朗

+2

请告诉我们的'子StopSuperviser'内容。 – pndc

+0

好点,@Peter,也许他滥用'$ _ [0]'。 – ikegami

+0

@ikegami这是我的怀疑,但我们需要看到代码是肯定的。 – pndc

回答

0

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

它在perlsub描述的特征的表达式:

如果子程序使用&形式调用,参数列表是 可选的,并且如果省略,没有@_阵列被设置为子例程: 调用时的@_数组对于子例程是可见的。

如果没记错,你应该能够通过改变来解决它:

local $SIG{HUP} = \&StopSuperviser; 

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

你好,thx很多为你的帮助。我已经改变了我的代码,但是这并没有解决我的问题。如果您再次找到Perlmonks的解决方案,我将很高兴阅读这些解决方案;) – ehretf

+0

您所寻找的答案可能在这里:http://www.perlmonks.org/bare/?node_id=107372 – GraduateOfAcmeU