为什么在做一个分叉时我得到2个进程?

时间:2014-11-28 14:19:16

标签: linux bash perl

运行下面使用Parallel::ForkManager的代码时,我得到两个睡眠过程而不是预期的一个。

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

print命令退出之前,它也不会执行sleep命令。我本来期望perl脚本会在我fork时继续。或者我错过了什么?

#!/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";

1 个答案:

答案 0 :(得分:1)

因为您在父级和子级中调用了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();

当然,如果您在systemfinish之间没有做任何事情,那么您也可以使用exec获取perl + sleep而不是perl + perl + sleep。< / p>

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

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

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

$pm->wait_all_children();