我在 Perl 中使用 Fork 时遇到问题。我想从一个脚本一次性执行 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 个子进程被执行。
任何人都可以告诉我我在这里做错了什么吗?
孩子们也用叉子。您需要在子案例中以一种或另一种方式退出循环。常见的模式是 fork 并执行,或者您可以直接说
last
。
发生这种情况是因为当您分叉一个进程时,它会创建两个进程。我们称它们为
a1
和a2
。现在 a1
是父级,a2
是子级,因此当执行 a2
时,它会创建 b1
和 b2
。当这些全部执行时,它们还会递归地创建新进程。
独立于 Perl:了解 fork 的工作原理!
在循环中,第一个被分叉的进程继续执行循环 `` $TotalProcessToFork -1
times, the second process being forked by the original parent will execute the loop
$TotalProcessToFork -2` 次,依此类推...
此外第一个子进程分叉的第一个子进程将也执行循环
$TotalProcessToFork -3
次。
也许试试这个代码:
#!/usr/bin/perl
use warnings;
use strict;
my $TotalProcessToFork = 3;
for (1..$TotalProcessToFork) {
print "PID $$ processes $_\n";
if ((my $pid = fork) > 0) {
print "parent $$ processing $_ created PID $pid\n";
} else {
print "child $$ processes $_\n";
}
}
当我运行它时,我得到以下输出:
PID 13415 processes 1
parent 13415 processing 1 created PID 13416
PID 13415 processes 2
child 13416 processes 1
parent 13415 processing 2 created PID 13417
PID 13415 processes 3
PID 13416 processes 2
parent 13415 processing 3 created PID 13418
parent 13416 processing 2 created PID 13419
PID 13416 processes 3
PID 13417 processes 3
parent 13416 processing 3 created PID 13420
parent 13417 processing 3 created PID 13421
child 13420 processes 3
child 13418 processes 3
child 13421 processes 3
child 13419 processes 2
PID 13419 processes 3
child 13422 processes 3
parent 13419 processing 3 created PID 13422