my @datenArray; for my $i (0..$#Dateien) { my $DateiName=$Dateien[$i]; #Wenn die Datei nicht geöffnet werden konnte mit der nächsten fortsetzen. open my $fh. '<', $DateiName or die "Error open $DateiName $!"; my $daten=do{ local $/ = undef; return ; } close $fh; push (@datenArray, [$daten,$DateiName]); #60 Dateien in den Arbeitsspeicher einlesen und dann verarbeiten #oder wenn die letzte Datei erreicht wurde next if(@datenArray < 60 || $i != $#Dateien); #Daten aus Array holen und Eintrag löschen say "Modulo 60 oder alle Dateien" if $Debug; # wenn sich ein Kindprozess beendet, # dann die PID holen und Eintrag aus %childs löschen my %childs; local $SIG{CHLD}=sub{ my $pid=wait(); delete($childs{$pid}); }; while ( @datenArray ){ my ($DateiName,$Daten) = @{shift(@datenArray)}; # Kindprozess erzeugen; my $pid=fork; die "ERROR fork $!" unless defined $fork; # PID des Kindprozesses merken und dann nächsten Durchlauf if($pid){ $childs{$pid}=1; next; } # ab hier sind wir im Kindprozess say "Datei: $DateiName" if $Debug; my $R = Umwandeln($Daten,$DatAnz,$DateiName); InDateiSchreiben($R); # Kindprozess beenden exit; } # auf Kinder warten while(%childs){ # pause select(undef,undef,undef,0.10); # prüfen ob die Kindprozesse noch laufen # wenn nicht dann PID aus %childs löschen for(keys(%childs)) { delete($childs{$_}) unless(kill(0,$_)); } } }