私は、一連の子を生成するスクリプトを持っています。親は、各子供が終了するのを待つ必要があります。私のスクリプトは、以下のperlスクリプトに似行い子プロセスをPerlから取得する
:私は上記の提供したコードと同様に
#! /usr/bin/perl
use strict;
use warnings;
print "I am the only process.\n";
my @children_pids;
for my $count (1..10){
my $child_pid = fork();
if ($child_pid) { # If I have a child PID, then I must be the parent
push @children_pids, $child_pid;
}
else { # I am the child
my $wait_time = int(rand(30));
sleep $wait_time;
my $localtime = localtime;
print "Child: Some child exited at $localtime\n";
exit 0; # Exit the child
}
}
foreach my $child (@children_pids) {
print "Parent: Waiting on $child\n";
waitpid($child, 0);
my $localtime = localtime;
print "Parent: Child $child was reaped - $localtime.\n";
}
print "All done.\n";
、それぞれの子が完了するの異なる時間がかかることがあります。
問題は、最後のforeach
ブロックで、子PIDをループすることによって子どもを刈り取ろうとするときです。親は、作成された順番で子を待ちます。
明らかに、子供たちは産卵された順番で終わらないので、私は早期に終わる子供のためのゾンビプロセスが残っています。
私の実際のコードでは、これらの子どもたちはお互いに前に終わることがあり、周りに浮かんでいるゾンビプロセスの数は何百にも増えます。
子供たちを刈り取るより良い方法はありますか?
通知する主な理由:成功したかどうかを確認する。 – ikegami
こんにちはボロディン、[構文::機能::ループ](http://search.cpan.org/perldoc?Syntax::Feature::Loop)をチェックしてください – ikegami
@ikegami:はい私は時々それを使用します。私はたいてい 'while(1)'、 'while()'と '{... redo; } '。本当に満足できるものはありません。 – Borodin