2012-11-07 83 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