无法运行分叉,分叉了不需要的进程数量

问题描述 投票:0回答:4

我在 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 个子进程被执行。

任何人都可以告诉我我在这里做错了什么吗?

perl fork
4个回答
4
投票

孩子们也用叉子。您需要在子案例中以一种或另一种方式退出循环。常见的模式是 fork 并执行,或者您可以直接说

last


1
投票

发生这种情况是因为当您分叉一个进程时,它会创建两个进程。我们称它们为

a1
a2
。现在
a1
是父级,
a2
是子级,因此当执行
a2
时,它会创建
b1
b2
。当这些全部执行时,它们还会递归地创建新进程。


1
投票

您可能想看看

Parallel::ForkManager
,这可能会让您的生活更轻松。

另外,不要使用外部 Linux

touch
命令;最好使用
File::Touch


0
投票

独立于 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
© www.soinside.com 2019 - 2024. All rights reserved.