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

kknvjkwl  于 2023-10-24  发布在  Perl
关注(0)|答案(4)|浏览(164)

我有一个问题,在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个子进程被执行。
谁能告诉我我在这里做错了什么。

hmtdttj4

hmtdttj41#

子循环也需要fork。在子循环的情况下,你需要以某种方式退出循环。一个常见的模式是fork和exec,或者你可以只说last

f4t66c6m

f4t66c6m2#

这是因为当你fork一个进程时,它会创建两个进程。让我们称它们为a1a2。现在a1是父进程,a2是子进程,所以当a2被执行时,它会创建b1b2。当这些进程都被执行时,它们也会递归地创建新进程。

70gysomp

70gysomp3#

你可能想看看Parallel::ForkManager,这可能会让你的生活更轻松。
另外,不要使用外部Linux touch命令;最好使用File::Touch

r7s23pms

r7s23pms4#

独立于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

相关问题