gpt4 book ai didi

linux - 为什么我做一个fork时得到2个进程?

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:26 25 4
gpt4 key购买 nike

运行以下使用 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 - 为什么我做一个fork时得到2个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com