我有一个脚本,它会生成一组子进程。父进程必须等待每个子进程完成。
我的脚本类似于以下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块中,父进程按它们创建的顺序等待子进程。
显然,子进程完成的顺序与它们被生成的顺序不一致,因此我会得到一堆早期完成的子进程的僵尸进程。
在我的实际代码中,这些子进程可能会在彼此之前几天就完成,并且围绕着的僵尸进程数量会增长到数百个。
有没有更好的方法可以回收一组子进程?
while (1)
、while ()
和{... redo;}
之间切换。没有一个真正令人满意。 - Borodinfor
循环在我看来一直是件丑陋的事情。如果没有C语言的先前了解,它是无法理解的,也很少能做到你真正想要的。它有一个优点:continue
子句位于循环顶部,这是它应该存在的位置。 - Borodinwaitpid
的非阻塞版本?我在这里和perlipc
文档中都看到了它,但没有描述为什么。在这种情况下,既然我刚刚收到了一个子进程的死亡消息,waitpid
不是保证返回一些东西吗?而且,那个while()
循环对CPU来说似乎是一个相当不必要的负担... 我错过了什么吗? - zrajm