Прочёл http://www.samag.com/documents/s=4075/sam1013019385270/sam02...там рекомендуется
use Fcntl ':flock'; # import LOCK_* constants
open COUNTER, "<counter.dat"
or die "Can't read-open: $!";flock COUNTER, LOCK_EX; #
А в другом скрипте (рабочем) я нашёл
if(open(GET, "<$gf_path")) {
flock(GET, '2');
@gf_contents = <GET>;
close(GET);Моего англиийского и умения писать скрипты не хатает, чтоб разобраться. Поможите советом....
Когда читаешь из файла:
open(F,"<test");
flock(F,1);
....
close(F);Когда пишешь в файл:
open(F,">test");
flock(F, 2);
....
close(F);Лучше, когда переписывашь файл, создавать временный файл, т.е. пирмерно так:
if (-f "test.tmp"){
die "File locked !";
}
open(F,">test.tmp");
flock(F,1);
....
close(F);
rename("test.tmp", "test"); # Атомарное переименование.Это простейший пример, нужно еще следить за тем, чтобы test.tmp не остался после аварийного падения скрипта и не заблокировал всю дальнейшую работу. Т.е. условие для максимального времени жизни лока в 30 секунд будет примерно такое:
if (-f "test.tmp" ){
if ((time() - stat("test.tmp"))[9] <= 30){
die "File locked !";
} else {
unlink("test.tmp"); # Время жизни лока истекло.
}
}