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”)
脚本永远不会退出。在清理中引入错误。固定的。