Я выполняю цикл while, читая каждую строку в файле, а затем выполняю процессы fork с данными строки для дочернего элемента. После N строк я хочу дождаться завершения дочерних процессов и перейти к следующим N строкам и т. Д.
Это выглядит примерно так:
while ($w=<INP>) {
# ignore file header
if ($w=~m/^\D/) { next;}
# get data from line
chomp $w;
@ws = split(/\s/,$w);
$m = int($ws[0]);
$d = int($ws[1]);
$h = int($ws[2]);
# only for some days in the year
if (($m==3)and($d==15) or ($m==4)and($d==21) or ($m==7)and($d==18)) {
die "could not fork" unless defined (my $pid = fork);
unless ($pid) {
some instructions here using $m, $d, $h ...
}
push @qpid,$pid;
# when all processors are busy, wait for child processes
if ($#qpid==($procs-1)) {
for my $pid (@qpid) {
waitpid $pid, 0;
}
reset 'q';
}
}
}
close INP;
Это не работает. После первого раунда процессов я получаю некоторый PID, равный 0, массив @qpid смешивается, и файл начинает читать в (очевидно) случайных местах, перепрыгивая назад и вперед. Конечным результатом является то, что большинство строк в файле читаются два или три раза. Есть идеи?
Заранее большое спасибо,
С. * * +1010