【问题标题】:How to exit a child process when another child finishes当另一个孩子完成时如何退出一个子进程
【发布时间】:2013-05-29 04:14:16
【问题描述】:

我正在开发一个脚本来对用多种语言(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

当masExec() 完成时,我需要完成topExec()(TOP 执行),但是脚本在 TOP 命令之后挂起。

额外问题:有没有办法让在masExec() 中执行的程序的系统 pid 以在 TOP 命令中跟踪它?现在,我正在从 Unix Top 命令(sub topExec)中的用户和命令列进行跟踪。

抱歉有任何语言错误(非本地语言;))。

【问题讨论】:

    标签: perl parallel-processing fork


    【解决方案1】:

    kill(TERM =&gt; $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 的症状。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2013-09-15
      • 2010-09-21
      • 1970-01-01
      相关资源
      最近更新 更多