【发布时间】:2020-09-24 23:18:18
【问题描述】:
我需要在主程序中访问通过分叉的子程序生成的哈希内容。这就是我想要做的事情:-
use Benchmark;
use File::Find;
use File::Basename;
use File::Path;
use Data::Dumper;
use strict;
use warnings;
print "Process ID: $$ \n";
my @PartitionRoots = qw(/nfs/dir1 /nfs/dir2 /nfs/dir3 /nfs/dir4);
my @PatternsToCheck = qw(prefix1 prefix2);
my @MatchedDirnames = qw();
my $DirCount = 0;
my $Forks = 0;
my @AllDirs = qw();
my %SweepStats = ();
foreach my $RootPath (@PartitionRoots) {
foreach my $Pattern (@PatternsToCheck) {
if (grep {-e} glob ("$RootPath/$Pattern*")) {
my @Files = glob ("$RootPath/$Pattern*");
foreach my $FileName (@Files) {
if (-d $FileName) {
$DirCount++;
push (@AllDirs, $FileName);
my $PID = fork;
if (not defined $PID) {
warn 'Could not fork!\n';
next;
}
if ($PID) {
$Forks++;
print "In the parent PID ($$), Child pid: $PID Number of forked child processes: $Forks\n";
} else {
print "In the child PID ($$)\n";
find(\&file_stats, $FileName);
print "Child ($$) exiting...\n";
exit;
}
}
}
}
}
}
for (1 .. $Forks) {
my $PID = wait();
print "Parent saw child $PID exit.\n";
}
print "Parent ($$) ending.\n";
print Dumper (\%SweepStats);
foreach my $DirName (@AllDirs) {
print ("Printing $DirName contents...\n");
foreach (@{$SweepStats{$DirName}}) {
my $uname = $_->{uname};
my $mtime = $_->{mtime};
my $size = $_->{size};
my $file = $_->{file};
print ("$uname $mtime $size $file\n");
}
}
sub file_stats {
if (-f $File::Find::name) {
my $FileName = $_;
my $PathName = dirname($_);
my $DirName = basename($_);
my $uid = (stat($_))[4];
my $uname = getpwuid($uid);
my $size = (stat($_))[7];
my $mtime = (stat($_))[9];
if (defined $uname && $uname ne '') {
push @{$SweepStats{$FileName}}, {path=>$PathName,dir=>$DirName,uname=>$uname,mtime=>$mtime,size=>$size,file=>$File::Find::name};
} else {
push @{$SweepStats{$FileName}}, {path=>$PathName,dir=>$DirName,uname=>$uid,mtime=>$mtime,size=>$size,file=>$File::Find::name};
}
}
return;
}
exit;
...但是 Dumper 是空的,所以紧随其后的取消引用和打印也是空的。我知道文件统计收集正在工作,因为如果我用打印语句替换“push @{$SweepStats{$FileName}}”语句,我就会看到预期的结果。我只需要从全局级别正确访问哈希,但我不能完全正确。我在这里做错了什么?有各种关于将哈希传递给子程序的帖子,但反之则不然。
谢谢!
【问题讨论】:
-
如果你想限制模拟子节点的数量,你可以使用 Parallel::ForkManager。它甚至提供了一种将数据返回给父级的方法。
标签: perl multiprocessing fork ipc