Блокировка файла

Вурдалак

Продвинутый новичок
Блокировка файла

Какой смысл в коде а-ля
PHP:
while( ! flock($fh, LOCK_EX) ) {
    usleep(100);
}
?
Вижу часто и не понимаю: flock() же будет ждать, пока другой процесс не будет закрыт. Исключением будет, насколько я понял, случай с LOCK_NB флагом.

И пример из мануала:
PHP:
<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
    ftruncate($fp, 0); // truncate file
    fwrite($fp, "Write something here\n");
    flock($fp, LOCK_UN); // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

?>
В каких случаях я получу «Couldn't get the lock!»? На определённых ФС?
 

zerkms

TDD infected
Команда форума
PHP:
<?php

$file = '/tmp/filename';

$f1 = fopen($file, 'r+');
$r1 = flock($f1, LOCK_EX | LOCK_NB);

$f2 = fopen($file, 'r+');
$r2 = flock($f2, LOCK_EX | LOCK_NB);

flock($f1, LOCK_UN);

var_dump($r1);
var_dump($r2);
а вот функция в виде
while( ! flock($fh, LOCK_EX) ) {
usleep(100);
}
даже если навешать поверх NB бессмысленна, потому как не избавляет от race condition
 
Сверху