flock разное поведение блокировки в Windows и Linux

Bermuda

Новичок
flock разное поведение блокировки в Windows и Linux

Бъюсь над темой
http://phpclub.ru/talk/showthread.php?s=&threadid=97318&rand=19
Послушал умных людей, попробовал использовать flock() c LOCK_EX;

Поведение flock разное в windows и linux.

PHP:
<?php
$lock_file = "lock.txt";
$fp = fopen($lock_file, "w+");
flock($fp, LOCK_EX);

while (true) {
    echo "sleep\n";
    sleep(1);
} 
?>
Windows
1. Блокирую файл --> заблокирован
2. Прибиваю скрипт по ctrl+c --> разблокирован
3. Ручками удаляю lock.txt --> удален

Linux
1. Блокирую файл --> заблокирован
2. Прибиваю скрипт по ctrl+c --> заблокирован
3. Ручками удаляю lock.txt --> ругается и не удаляется

Что я делаю не так?
 

phprus

Moderator
Команда форума
3. Ручками удаляю lock.txt --> ругается и не удаляется
Может быть у тебя прав не хватает, чтобы удалить файл?

Тут надо использовать еще и константу LOCK_NB и после вызова flock проверять состояние. Если файл успешно заблокировался, то продолжаем работать, а иначе ругаемся на то что процесс уже запущен и умираем (это нужно чтобы лишние процессы не держать)
 

Bermuda

Новичок
Автор оригинала: hermit_refined
не верю.
Намек на то, что я пудрю мозги?
Код я привел.

Может быть у тебя прав не хватает, чтобы удалить файл?
Да прав вроде хватает. Если потом файл разблокировать, то он прекрасно удаляется.

Тут надо использовать еще и константу LOCK_NB и после вызова flock проверять состояние
Попробую.
Но все же, почему функция php flock ведет себя по разному на разных ОС?
В мануале это не описано (я не нашел).

-~{}~ 09.03.07 17:03:

phprus
надо использовать константу LOCK_NB
То что доктор прописал. Спасибо!

-~{}~ 09.03.07 17:17:

Все получилось.

Приведу решение, может кому пригодится

PHP:
<?php
$lock_file = sys_get_temp_dir() . "/" . basename($_SERVER["PHP_SELF"]);
$fp = fopen($lock_file, "w+");
$res = flock($fp, LOCK_EX + LOCK_NB);

print "\n" . $res . "\n";

while (true) {
    echo "sleep\n";
    sleep(1);
} 
?>
Функция sys_get_temp_dir (no version information, might be only in CVS).

Временная затычка

PHP:
<?php
if (!function_exists('sys_get_temp_dir')) {
    function sys_get_temp_dir() {
        $temp_file = tempnam(md5(uniqid(rand(), TRUE)), '');
        if ($temp_file) {
            $temp_dir = realpath(dirname($temp_file));
            unlink($temp_file);
            return $temp_dir;
        } else {
            return FALSE;
        }
    }
}
?>
 

hermit_refined

Отшельник
не, я правда не верю, что в linux рекомендательная блокировка не снимается при смерти процесса, и тем более - что после этого нельзя удалить файл (sic!).
Если потом файл разблокировать, то он прекрасно удаляется.
ну это тоже гениально, интересно, как вы его "разблокировали"?..

учили бы лучше матчасть, чем хвалиться.
 

hermit_refined

Отшельник
Тем же способом которым и заблокировал.
чума. из какого процесса? если тот, который установил её - уже убит, а блокировка по-вашему осталась?..
Код я привел. Взял, проверил и успокоился уже.
да, что в прошлой теме вы надменно разговаривали с людьми, знающими заведомо больше вас, так и в этой - откровенно неся бред, свысока претендуете на что-то, не пытаясь даже задуматься о реальности.
счастливой жизни.
 

Bermuda

Новичок
из какого процесса?
Из другого, как это можно было уже понять. В Linux блокировка остается после смерти процесса.

Вот есть люди которые ходят в топики только для того, чтобы там покакать. Да-да hermit_refined, на мой вопрос адресованный лично Вам вы не соизволили ответить. В падлу? Я же на все Ваши вопросы ответил.

прошлой теме вы надменно разговаривали
Если у Вас нет паранойи, то это не означает, что за Вами не следят. Оскорбились как ни странно только Вы. А знаете что? Подайте-ка на меня в суд :)
 

hermit_refined

Отшельник
на мой вопрос адресованный лично Вам вы не соизволили ответить
вопроса не было.
кстати, я не оскорбляюсь, а раздражаюсь.
Из другого, как это можно было уже понять. В Linux блокировка остается после смерти процесса.
вот оба утверждения и есть полный бред.
 

Bermuda

Новичок
Дело было-таки в правах.
После того как процесс с блокировкой файла завершен, из отдельного процесса файл удаляется.
Оказалось, что у меня меньше прав чем у nobody.

вопроса не было.
Намек на то, что я пудрю мозги?
Что я делаю не так?
 

hermit_refined

Отшельник
замечательно. но почитать вам что-нибудь на эту тему не помешает (потому как вы все равно не понимаете, как оно работает).
Намек на то, что я пудрю мозги?
Что я делаю не так?
как правило, я лишь указываю человеку на заблуждение, чтобы он не довольствовался мистическими объяснениями, а сам подумал и нашел, в чем его ошибка/невнимательность.
порой бывает и по-другому, но это из-за слишком хорошего настроения.
 
Сверху