Моя цель в этом вопросе состояла в том, чтобы заблокировать файл, используемый в качестве хранилища данных для нескольких сценариев. В конце я использовал код, подобный следующему (от Криса):
open (FILE, '>>', test.dat') ; # open the file
flock FILE, 2; # try to lock the file
# do something with the file here
close(FILE); # close the file
В его примере я удалил стаю FILE, 8, так как close (FILE) также выполняет это действие. Реальная проблема заключалась в том, что когда скрипт запускается, он должен содержать текущий счетчик, а когда он заканчивается, он должен обновить счетчик. Вот где Perl имеет проблему, чтобы прочитать файл, который вы:
open (FILE, '<', test.dat');
flock FILE, 2;
Теперь я хочу выписать результаты и, поскольку я хочу перезаписать файл, мне нужно снова открыть и обрезать, что приводит к следующему:
open (FILE, '>', test.dat'); #single arrow truncates double appends
flock FILE, 2;
В этом случае файл фактически разблокируется на короткий период времени, пока файл открывается снова. Это демонстрирует случай для файла внешней блокировки. Если вы собираетесь изменять контексты файла, используйте файл блокировки. Модифицированный код:
open (LOCK_FILE, '<', test.dat.lock') or die "Could not obtain lock";
flock LOCK_FILE, 2;
open (FILE, '<', test.dat') or die "Could not open file";
# read file
# ...
open (FILE, '>', test.dat') or die "Could not reopen file";
#write file
close (FILE);
close (LOCK_FILE);