我有一个问题,在Perl的分叉。我想执行10个分叉进程在一个单一的脚本去所有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个子进程被执行。
谁能告诉我我在这里做错了什么。
4条答案
按热度按时间hmtdttj41#
子循环也需要fork。在子循环的情况下,你需要以某种方式退出循环。一个常见的模式是fork和exec,或者你可以只说
last
。f4t66c6m2#
这是因为当你fork一个进程时,它会创建两个进程。让我们称它们为
a1
和a2
。现在a1
是父进程,a2
是子进程,所以当a2
被执行时,它会创建b1
和b2
。当这些进程都被执行时,它们也会递归地创建新进程。70gysomp3#
你可能想看看
Parallel::ForkManager
,这可能会让你的生活更轻松。另外,不要使用外部Linux
touch
命令;最好使用File::Touch
。r7s23pms4#
独立于Perl:了解fork是如何工作的!
在你的循环中,第一个被分叉的进程继续执行循环`` $TotalProcessToFork-1
times, the second process being forked by the original parent will execute the loop
$TotalProcessToFork-2 `次,依此类推.$TotalProcessToFork -3
次。试试这个代码:
当我运行它时,我得到了这样的输出: