linux - 为什么我在执行 1 个 fork 时会得到 2 个进程?

标签 linux bash perl

运行以下使用 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();

当然,如果你在systemfinish之间没有做任何事情,你不妨使用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/

相关文章:

linux - 一条命令删除目录及其子目录

linux - 解释脚本行

反引号内的 Bash 完成或 $() 使用 complete

bash - 如何从wget获取真实文件名

perl - Elastic Search 批量需要添加 header

perl - 如何将事务与 Stomp 和 ActiveMQ(和 Perl)一起使用?

linux - shell 脚本 : How if condition evaluates true or false

python - Centos 6 : scrapy commend not found(installed successfully)

bash - 在Visual Studio代码中直接在终端中执行文本编辑器中当前选择的行

perl - 识别 Perl/DBI 代码中的内存问题