当另一个孩子完成时如何退出一个子进程
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 => $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
的症状。
【讨论】:
以上是关于当另一个孩子完成时如何退出一个子进程的主要内容,如果未能解决你的问题,请参考以下文章