我有一个产生一组孩子的脚本。父母必须等待每个孩子完成。
我的脚本执行类似于以下 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";
与我上面提供的代码类似,每个孩子可能需要不同的时间来完成。
问题是当我尝试通过遍历子 PID 来获取子时,在最后一个foreach
块中,父级按照子级的创建顺序等待子级。
显然,孩子们并没有按照他们产生的顺序完成,所以我留下了一堆僵尸进程,这些孩子碰巧提前完成了。
在我的实际代码中,这些孩子可能会提前几天完成,并且漂浮的僵尸进程的数量可能会增长到数百个。
有没有更好的方法让我收获一组孩子?