- 论坛徽章:
- 0
|
1.开了50个子进程(每个子进程都是打印进程号,等5秒然后退出,fork在for循环里,中间没有等待,代码如下)
试了几次,结束后$num_proc总是不为0(为2或3)导致程序无法结束,猜测是子进程结束时同时发出信号导致$num_proc收到多个信号但却只自减了一次。
这种情况怎么修改才能让它正常结束?谢谢指教
$SIG{CHLD} = sub { $num_proc-- };
for (my $i = 0; $i < 10; $i ++) {
## == fork a new process ==
my $pid = fork();
if (!defined($pid)) {
print "Error in fork: $!";
exit 1;
}
if ($pid == 0) {
## == child proc ==
print "Child $i : My pid = $$\n";
sleep(5);
print "Child $i : end\n";
exit 0;
}
$num_proc ++;
## == if need to collect zombies ==
if (($i-$num_proc-$num_collect) > 0) {
while (($collect = waitpid(-1, WNOHANG)) > 0) {
$num_collect ++;
}
}
}
do {
sleep(1);
} until ($num_proc == 0);
2.同样是上面的代码,子进程调用一段执行大约13秒左右的程序,然后同时执行40个花了45秒左右。如果才能改进,进一步缩短时间?求指教,谢谢~ |
|