如何在另一个孩子完成时退出子进程

时间:2013-05-29 04:14:16

标签: perl parallel-processing fork

我正在开发一个脚本来基准测试和比较用各种语言编写的程序(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)中跟踪用户和命令列。

对于任何语言错误(两者都不是原生的;)抱歉。

1 个答案:

答案 0 :(得分:2)

kill(TERM => $pid[0]);


顺便说一句,我不明白为什么你在这里使用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;。对于初学者,你有许多未声明的变量。

  1. $commands[0]= sub{topExec};
    $commands[1]= sub{masExec};
    

    应该是

    my @commands = ( \&topExec, \&masExec );
    

    (声明数组,不要创建不必要的匿名潜艇。)

  2. for(my $i=0; $i <= $#commands; $i++) {
        ... $commands[$i] ...
    

    应该更简单

    for my $i (0..$#commands) {
        ... $commands[$i] ...
    

    甚至

    for my $command (@commands) {
        ... $command ...
    
  3. undef(@pid);
    

    完全不需要。这是未正确声明@pid的症状。