我的查询:
在下面的代码中我试图打印$commandoutput[0]
被转移或传递到即将到来的子程序中。我尝试通过转移来传递它。但我失败了。你能帮我正确的方法吗?
Code:
my $max_forks = 4;
#createThreads();
my %commandData;
my @arr = (
'bhappy', 'bload -m all -l -res CPUSTEAL',
'bqueues', 'bjobs -u all -l -hfreq 101'
);
#print @arr;
my $fork = new Parallel::ForkManager($max_forks);
$fork->run_on_start(
sub {
my $pid = shift;
}
);
$fork->run_on_finish(
sub {
my ( $pid, $exit, $ident, $signal, $core ) = @_;
if ($core) {
print "PID $pid core dumped.\n";
}
else { }
}
);
my @Commandoutput;
my $commandposition = 0;
for my $command (@arr) {
$fork->start and next;
my @var = split( " ", $command );
$commandoutput[$commandposition] = `$command`;
$commandposition++;
$line = $commandoutput[0];
# print $line;
$fork->finish;
}
$fork->wait_all_children;
#print Dumper(\%commandData);
print $commandoutput[0];
在这里我试图存储打印$commandoutput[0]
在子例程内的变量中。我在这里门控如何将变量从子例程外部传递到子例程内部。
sub gen_help_data
{
my $lines=shift;
print $lines;
}
我认为您误解了叉子的作用。当您成功分叉时,您将创建一个独立于您开始的进程的子进程来继续工作。因为它是一个单独的进程,所以它有自己的内存、变量等,即使其中一些是作为父进程的副本开始的。
所以你正在设置$commandoutput[0]
在每个子进程中,但是当该子进程终止时,其副本的内容也会终止@commandoutput
.
您可以串行运行每个命令,也可以使用线程(这会带来许多其他问题 - 即使使用线程,您的代码也需要进行一些重大的重新设计),或者您可以使用事件(POE、AnyEvent 等)这将是另一个重大的重新设计)。或者,您可以运行每个命令,并将其输出放入临时文件中,然后,在所有子命令完成后,读取每个文件并继续。这也会带来问题,但通常比其他问题少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)