2014-01-09 51 views
0

嗯,我是新來的Perl編程(或一般的任何語言) 我有語言的基本理解和已經寫在運行過程中我多次分叉線程這裏的腳本的一個片段一個小腳本。如何殺死分叉進程?

use Perl6::Slurp; 
use Parallel::ForkManager; 

my $pm = Parallel::ForkManager->new(10); 
my $time = 100; 

alarm("$time"); 

for my $i (0 .. 100) { 
    my $pid = $pm->start and next; 
    job(); 
    $pm->finish; 
} 
$pm->wait_all_children; 

sub job { 
    print "Function Started On Thread"; 
} 

現在,這不是我的實際代碼。但它幾乎是沒有這個功能的摘要 我希望它在報警結束時結束。

現在,我不知道這是一個簡單的動作,但正如我所說的IM真正的新節目一般。 感謝任何人的幫助!

+0

這是一個有點硬從您的代碼來告訴你真正想要的,因爲它似乎包含了一些不一致的地方(例如是'attack'意思是'job'?)。你的意思是你想讓所有子過程在報警結束時終止?或者你只是想限制每個子進程使用的時間? –

+0

哦,我們對此深感抱歉,我沒有意識到,我改變了它,是攻擊和工作都假設是一樣的,我希望所有的子進程在報警(所以整個腳本會殺死自己相當多的死結束) –

+0

您也可能會看到http://stackoverflow.com/questions/2839824/how-should-i-clean-up-hung-grandchild-processes-when-an-alarm-trips-in-perl和[停止叉並行:: ForkManager(http://www.perlmonks.org/?node_id=797554) –

回答

1

發送一個信號給處理組。只需添加以下到父:

local $SIG{ALRM} = { 
    local $SIG{TERM} = 'IGNORE'; 
    kill TERM => -$$; 
    die "Timed out\n"; 
}; 
+0

如果您願意,可以發送'ALRM'而不是'TERM'。 – ikegami