我正在开发一个脚本来基准测试和比较用各种语言编写的程序(Perl,Java,R)。我需要同时运行两个子程序,一个用于使用Unix TOP命令,另一个用于执行程序。我正在尝试使用Parallel :: ForkManager。这里是我用来分叉的代码:
sub parallelRun{
$commands[0]= sub{topExec};
$commands[1]= sub{masExec};
my $manager = new Parallel::ForkManager( 2 );
for($i=0; $i <= $#commands; $i++) {
$pid = $manager-> start and next;
push(@pid,$pid);
$commands[$i]();
$manager-> finish;
} # For End
$manager->wait_all_children;
$manager-> finish($pid[0]);
undef(@pid);
} # Sub End
我需要在topExec()
完成时完成masExec()
(TOP执行),但脚本在TOP命令后挂起。
奖金问题:有没有办法让masExec()
中执行的程序的系统pid在TOP命令中跟踪它?现在,我在Unix Top命令(sub topExec)中跟踪用户和命令列。
对于任何语言错误(两者都不是原生的;)抱歉。
答案 0 :(得分:2)
顺便说一句,我不明白为什么你在这里使用P :: FM。你甚至不需要创建两个孩子。
use POSIX qw( _exit );
sub parallelRun {
my $pid = fork();
die if !defined($pid);
if (!$pid) {
topExec();
_exit(0);
}
masExec();
kill(TERM => $pid);
waitpid($pid, 0);
}
一些Perl提示:
始终使用use strict; use warnings;
。对于初学者,你有许多未声明的变量。
$commands[0]= sub{topExec};
$commands[1]= sub{masExec};
应该是
my @commands = ( \&topExec, \&masExec );
(声明数组,不要创建不必要的匿名潜艇。)
for(my $i=0; $i <= $#commands; $i++) {
... $commands[$i] ...
应该更简单
for my $i (0..$#commands) {
... $commands[$i] ...
甚至
for my $command (@commands) {
... $command ...
undef(@pid);
完全不需要。这是未正确声明@pid
的症状。