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

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

我有一个问题,在Perl的分叉。我想执行10个分叉进程在一个单一的脚本去所有10个子(分叉)进程将做同样的事情(复制文件从一个地方到另一个)。
当我执行这段代码时,我的操作系统挂起,当我实际检查时,一次有很多进程被分叉。
下面是我的代码:

  1. while ($callCount <= $totalCalls) {
  2. for (1..$TotalProcessToFork) {
  3. print "Call -> $callCount";
  4. if($pid = fork) {
  5. #in Parent Process
  6. print " :: PID -> $pid\n";
  7. push(@list_of_pid, $pid);
  8. } else {
  9. #in Child Process
  10. `touch $callCount`;
  11. }
  12. $callCount++;
  13. }
  14. }

现在当我执行这段代码时,大约有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次。

试试这个代码:

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my $TotalProcessToFork = 3;
  5. for (1..$TotalProcessToFork) {
  6. print "PID $$ processes $_\n";
  7. if ((my $pid = fork) > 0) {
  8. print "parent $$ processing $_ created PID $pid\n";
  9. } else {
  10. print "child $$ processes $_\n";
  11. }
  12. }

当我运行它时,我得到了这样的输出:

  1. PID 13415 processes 1
  2. parent 13415 processing 1 created PID 13416
  3. PID 13415 processes 2
  4. child 13416 processes 1
  5. parent 13415 processing 2 created PID 13417
  6. PID 13415 processes 3
  7. PID 13416 processes 2
  8. parent 13415 processing 3 created PID 13418
  9. parent 13416 processing 2 created PID 13419
  10. PID 13416 processes 3
  11. PID 13417 processes 3
  12. parent 13416 processing 3 created PID 13420
  13. parent 13417 processing 3 created PID 13421
  14. child 13420 processes 3
  15. child 13418 processes 3
  16. child 13421 processes 3
  17. child 13419 processes 2
  18. PID 13419 processes 3
  19. child 13422 processes 3
  20. parent 13419 processing 3 created PID 13422
展开查看全部

相关问题