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

Posted

技术标签:

【中文标题】当另一个孩子完成时如何退出一个子进程【英文标题】: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]= subtopExec;
$commands[1]= submasExec;

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)中的用户和命令列进行跟踪。

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

【问题讨论】:

【参考方案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;。对于初学者,您有许多未声明的变量。

    $commands[0]= subtopExec;
    $commands[1]= submasExec;
    

    应该是

    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 的症状。

【讨论】:

以上是关于当另一个孩子完成时如何退出一个子进程的主要内容,如果未能解决你的问题,请参考以下文章

MPI C 将矩阵逐行发送到所有进程子进程 (MPI_COMM_SPAWN)

创建一个不是创建进程子进程的新进程

38父进程子进程进程组作业和会话

VC++如何实时监测另一个进程是否已经退出?(附源码)

非阻塞等待子进程退出

当另一个类完成处理所需数据时如何中断 Viewcontroller