我已经实现了用于解析巨大文件的forking概念,如下所示,但它似乎不正确。我在代码中遇到的一些问题有些变量是无法访问的。
#ALL the variable in Complete CAPS are global variable
TLog("MSG",1,"Parent process $$");
TLog("MSG",4,"Creating child process for $$");
my $MAX_FORK = 2;
my $forkCount = 0;
my $processCounter = 0;
my @childId = ();
foreach my $fileNameFasta (@{$ref_array_file}) {
my $pid = fork();
if ( $pid ) {
TLog("MSG",1,"child process created : $pid");
push @childId,$pid;
$forkCount++;
}
elsif ( $pid == 0 ) {
my $outputFile = $STAT_FILE;
my $pidLocal = $childId[$processCounter]; #Use of unintialized variable
$outputFile =~s/\d{1,}\.txt$/$pidLocal\.txt/og; #hence naming of all ouput file are same
TLog("MSG",1,"For $pidLocal Creating output file for stat : $outputFile");
open my $outputfh,'>',$outputFile;
GenerateTupleCountFile($outputfh,$fileNameFasta);
close $outputfh;
TLog("MSG",5,"Calculation completed for $pidLocal");
TLog("MSG",5,"Plz check the $outputFile");
$processCounter++;
exit(0);
}
if ( $forkCount >= $MAX_FORK ) {
foreach (@childId) {
my $tmp = waitpid($_, 0);
TLog("MSG",5,"Process completed for with pid $tmp");
}
}
}
}如果我错了,请给我正确的方向。
发布于 2013-01-28 23:29:33
一旦分支发生,父进程和子进程就是自治的。
直到fork之后,您才会在@childID数组中设置任何内容,而此时对于孩子来说,要知道其中写了什么已经太晚了。您需要在子级中使用getpid(),或者使用神奇的变量- $$,或者(如果您使用了use English '-no_match_vars';) $PID或$PROCESS_ID。父级从不递增$processCounter。
类似地,子进程会递增其$processCounter副本,但这不会影响父进程中的变量。
https://stackoverflow.com/questions/14565136
复制相似问题