Linux 为什么我在做一个fork时得到两个进程?

Linux 为什么我在做一个fork时得到两个进程?,linux,bash,perl,Linux,Bash,Perl,当运行下面使用的代码时,我得到两个睡眠进程,而不是预期的一个 18748 pts/2 S+ 0:00 /usr/bin/perl ./fork.pl 18749 pts/2 S+ 0:00 /usr/bin/perl ./fork.pl 18750 pts/2 S+ 0:00 sleep 12345 18751 pts/2 S+ 0:00 sleep 12345 而且,在sleep命令退出之前,它不会执行打印命令。当我使用fork时,我希

当运行下面使用的代码时,我得到两个睡眠进程,而不是预期的一个

18748 pts/2    S+     0:00 /usr/bin/perl ./fork.pl
18749 pts/2    S+     0:00 /usr/bin/perl ./fork.pl
18750 pts/2    S+     0:00 sleep 12345
18751 pts/2    S+     0:00 sleep 12345
而且,在
sleep
命令退出之前,它不会执行
打印
命令。当我使用fork时,我希望perl脚本会继续。还是我遗漏了什么

#!/usr/bin/perl
use Parallel::ForkManager;
my $pm = new Parallel::ForkManager(5);

my $pid = $pm->start;
system("sleep 12345");
print "pid inside $pid\n";
$pm->finish;

print "pid outside $pid\n";

因为您在父级和子级中调用了
system
。检查
start
的返回值,如文档所示

#!/usr/bin/perl
use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(5);

my $pid = $pm->start;
if (!$pid) {
   print "From child: $$\n";
   system("sleep 12345");
   $pm->finish;
}

print "From parent: $$ $pid\n";
$pm->wait_all_children();
当然,如果您不在
system
finish
之间执行任何操作,那么您最好使用
exec
来获得perl+睡眠,而不是perl+perl+睡眠

#!/usr/bin/perl
use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(5);

if (!$pm->start) {
   exec("sleep 12345")
      or die($!);
}

$pm->wait_all_children();

这正是我需要的=)当您在/usr/share/perl5/vendor\u perl/Parallel/ForkManager.pm第463行的子进程中时,此错误意味着
无法启动另一个进程。
我在运行脚本时得到它。更改为
系统(“睡眠3”)
脚本永远不会退出。在清理中引入错误。固定的。