运行以下使用 Parallel::ForkManager 的代码时我得到了两个 sleep 进程,而不是预期的一个。
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
命令退出之前,它不会执行 print
命令。我原以为当我 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+sleep而不是 perl+perl+sleep。
#!/usr/bin/perl
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new(5);
if (!$pm->start) {
exec("sleep 12345")
or die($!);
}
$pm->wait_all_children();
关于linux - 为什么我在执行 1 个 fork 时会得到 2 个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190631/