Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > проверить файл не используют ли его другие процесс


Автор: Valeria 20.9.2006, 11:43
в скрипте перед открытием файла на чтение надо проверить не использует ли его кто-то другой?!
в частности, надо точно знать, что в него закончена запись. чтобы потом читать!
как это сделать???

Автор: Bikutoru 20.9.2006, 12:02
Не знаю, есть ли возможность узнать пользуется ли кто-то еще этим файлом.
Но есть возможность "синхронизировать" доступ к файлу с помощью функции flock.
Вот ссылки по данной теме:
http://www.linux.org.ru/books/perl-faq/ru-perl-faq-8.html#ss8.4
http://www.linux.org.ru/books/perl-faq/ru-perl-faq-11.html#ss11.1
http://webmastak.com/articles/2005/03/18/no-flock/

Автор: Valeria 20.9.2006, 13:29
а как пользоваться функцией flock?
Код

open $CDRFile, "<", "$filename.dat" or die "Can't open file '$filename.dat': $!\n";
until(flock($CDRFile,2)){
sleep(1);
}


почему он пишет, что файл не открыт?

Код

flock() on unopened filehandle at script.pl


Автор: Bikutoru 20.9.2006, 16:08
"На первой ссылке" есть замечательный, хорошо прокомментированный пример:
Код

use Fcntl; # Импорт констант
open (HOSTS, '>>hosts.log'); # Файл открыт для добавления записи
flock(HOSTS, LOCK_EX); 
# Теперь файл заблокирован: Если любой другой скрипт тоже вызовет flock на
# этом файле, его flock не вернет управление в программу, пока мы не
# разблокируем файл. Обратите внимание: flock -- декларативная функция, если
# один из скриптов ее не использует при записи, то вся ваша блокировка не
# работает.
print HOSTS $ENV{REMOTE_HOST}, "\n"; # записали строку
close HOSTS; # Файл при закрытии разблокируется автоматически


А использовать flock в цикле не нужно - достаточно воспользоваться им один раз. Ведь flock это синхронизирующая функция - пока с этим файлом работает один поток, другой туда доступа не получит (программа во втором потоке приостановит свое выполнение на вызове flock и возобновит только после освобождения файла первым потоком).

Автор: Valeria 20.9.2006, 16:18
спасибо, только это мне не подойдет. я блокирую файл, а мне надо знать, что он уже готов к использованию.
мне предложили другой способ, но не знаю, как проверить, что он работает.
Код

while ( -s $CDRFile >$size ) { 
$size = -s $CDRFile; 
sleep 5; 
}

т.е. ждать пока размер файла меняется, только как угадать, может он будет раз в 20 сек. меняться, а я 19 поставлю.
уже не сработает. просто не знаю, каким образом формируется этот файл.

Автор: amg 21.9.2006, 06:22
Valeria, все же Bikutoru предлагает наиболее правильное решение! Дело в том, что flock - это системная функция, и ею пользуются не только перловские скрипты, но все другие программы, работающие с файлами (если они аккуратно сделаны). Так что если файл открыт другой программой, то flock просто не даст Вашему скрипту ничего с ним сделать, пока эта другая программа файл не закроет. И наоборот, если Ваш скрипт открыл файл, то другая программа его не тронет. А если две программы пытаются одновременно работать с одним и тем же файлом без flock, то, скорее всего этот файл в конце концов будет просто испорченным.

Автор: amg 21.9.2006, 06:42
Если есть подозрение, что другая программа не использует flock, то всякие проверки на неизменность файла делать нужно, но flock тоже неплохо использовать (а вдруг другая программа все же использует flock, и тогда просто эти проверки наверняка окажутся успешными).

Автор: Valeria 21.9.2006, 09:30
т.е. предлагаешь использовать и проверку на неизменность файла и блокировку. 
тогда, что первым смотреть? неизменность файла видимо, а потом блок ставить?

Автор: Bikutoru 21.9.2006, 10:09
Цитата(Valeria @  20.9.2006,  17:18 Найти цитируемый пост)
я блокирую файл, а мне надо знать, что он уже готов к использованию

Так блокировка в том и заключается, что если вы уже испорльзуете flock на одном потоке, то на втором flock не просто блокирует файл, а ждет, пока первый поток не разблокирует файл, и только после этого блокирует файл сам и продолжается выполнение скрипта. Хотя если хотя бы на одном из потоков flock не используется, то использовать его на остальных смысла нет.

Цитата(Valeria @  20.9.2006,  17:18 Найти цитируемый пост)
ждать пока размер файла меняется, только как угадать, может он будет раз в 20 сек. меняться, а я 19 поставлю.
уже не сработает. просто не знаю, каким образом формируется этот файл

А что если размер файла уменьшится, тогда ваш будет вариант непригоден

Автор: Valeria 21.9.2006, 10:20
Цитата

А что если размер файла уменьшится, тогда ваш будет вариант непригоден

уменьшаться не будет - 100% (это известно).

Цитата

если вы уже испорльзуете flock на одном потоке, то на втором flock не просто блокирует файл


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

я не уверена, что блокировка будет стоять и функция flock ее распознает?!

Автор: Bikutoru 21.9.2006, 10:34
Т.е. задача заключается в том, чтобы записать что-то в файл, который формирует какой-то недоступный даже для просмотра скрипт (или программа)? При этом сам формат файла неизвестен

Автор: Valeria 21.9.2006, 11:24

задача такая: скрипт должен взять файл с данными формата *.dat и начать с ним работать, но надо быть уверенным, что этот файл готов к использованию, т.е. запись в него выпонена, и больше его никто не использует.
вот мне и надо устроить такую проверку!!!

Автор: nitr 21.9.2006, 11:37
Valeria, прочтите про файл-серверы ;)

Автор: Valeria 21.9.2006, 13:32
Когда с работы уволят, будет уже поздно читать. вообще, мое время вышло, надо было уже скрипт написать.
так что, в свободное от работы время буду мучиться этим вопросом, теь более в переди выходные.

если здесь не найду ответа!!!

Автор: nitr 21.9.2006, 13:49
Valeria, smile) "работа не по голове" ;)
тебе тут уже всё "рассосали"... всё что можно, есть модули, может кто найдёт, у меня корпоративка, запрещены некоторые сайты smile
search.cpan.org тут искать

Автор: Valeria 21.9.2006, 14:38
Цитата

работа не по голове

За дуру меня только принимать не надо. по-моему, я спрашиваю не элементарные вещи.
а если мне дали такую работу, то отказываться я не буду.
не знаю я Perl, а в тему надо войти быстро. некогда мне читать книжки.
я итак весь день по интернету ищу нужную информацию.


nitr, не можешь помочь, так зачем вообще сюда заходишь?!

Автор: nitr 21.9.2006, 14:41
Valeria, smile
Цитата(Valeria @  21.9.2006,  14:38 Найти цитируемый пост)
сюда заходишь?!

"сюда" куда?
в этот топик?

тебе выложили инфу... я так помню у тебя *nix, flock там работает smile
ты же не принимаешь этого ответа smile
наверное ждёшь готовый скрипт? smile

Добавлено @ 14:41 
которые я давал в ответ другим ;)

Автор: amg 21.9.2006, 15:27
Цитата(Valeria @  21.9.2006,  14:38 Найти цитируемый пост)
...по-моему, я спрашиваю не элементарные вещи.
Valeria, беда в том, что вещи, о которых ты спрашиваешь, настолько не элементарные, что просто неразрешимы. И не только в перле. 

Автор: Valeria 21.9.2006, 16:16
Цитата

наверное ждёшь готовый скрипт?


nitr, уже ничего не жду. разберусь как-нибудь. тем более у меня уже другие проблемы.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)