我遇到了Perl中的Fork问题。我想从一个脚本执行10个Fork进程,所有10个子进程(分叉)进程都会做同样的事情(将文件从一个地方复制到另一个地方)。
当我执行此代码时,我的操作系统挂起,当我实际检查时,一次分叉的进程很多。
这是我的代码:
while ($callCount <= $totalCalls) {
for (1..$TotalProcessToFork) {
print "Call -> $callCount";
if($pid = fork) {
#in Parent Process
print " :: PID -> $pid\n";
push(@list_of_pid, $pid);
} else {
#in Child Process
`touch $callCount`;
}
$callCount++;
}
}
现在,当我执行此代码时,大约有1000个已处理的子项被执行。
任何人都可以告诉我我在这里做错了什么。
答案 0 :(得分:4)
孩子们也分叉了。您需要在子案例中以某种方式退出循环。一个常见的模式是fork和exec,或者你可以说last
。
答案 1 :(得分:1)
这是因为当您分叉进程时,它会创建两个进程。让我们称他们为a1
和a2
。现在a1
是父级,a2
是子级,因此在执行a2
时,会创建b1
和b2
。当这些全部执行时,它们也会递归地创建新进程。
答案 2 :(得分:1)
您可能需要查看Parallel::ForkManager
,这可能会让您的生活更轻松。
另外,不要使用外部Linux touch
命令;最好使用File::Touch
。