Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка файла, Блокировка файла 
:(
    Опции темы
study
Дата 22.8.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 20.9.2004

Репутация: нет
Всего: нет



Привет Всем!
Народ, хочу проконсультироваться по блокировки файла.
У меня два скрипта обращаются (чтение/запись) с файлом. Мне надо, чтобы они вместе не работали.
Делаю я так
Код

#!/usr/bin/perl
use Fcntl qw(:DEFAULT :flock);
open(DEV, "+</dev/cua0") or die "Cannot open port cua0";
unless (flock(DEV, LOCK_EX|LOCK_NB)){
        warn "cannot immediately write-lock the file ($!), blocking ... ";
        unless (flock(DEV, LOCK_EX)) {
                die "Cannot get write-lock on numfile: $!";
        }
}
print DEV "ХХХ";                         
close (DEV);


Вопрос. Будит ли этот код ожидать пока файл освободиться и сколько?
PM MAIL   Вверх
chaos
Дата 22.8.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



вот посмотри пример
Код

#!/usr/bin/perl -w
use strict;
use CGI qw(:all);
use Fcntl qw(:flock);
my $path_file = "/tmp/delivery.txt";
my $semaphore_file="/tmp/delivery.sem";
sub get_lock {
open (SEM, ">$semaphore_file") || die "Невозможно создать семафор: $!";
flock (SEM, LOCK_EX) || die "невозможно заблокировать файл";
}
sub release_lock {
close(SEM);
}
sub save {
get_lock();
open (M, ">>$path_file") || die "$!";
print M param('email'), " ", param('i1'), " ", param('i2'), " ", param('i3'), "\n";
close (M);
release_lock();
}
 
print header;
if (defined param('submit')) {
save();
}


PM WWW   Вверх
study
Дата 22.8.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 20.9.2004

Репутация: нет
Всего: нет



А здесь же по-моему, только файл delivery.sem блокируеться, а непосредственно delivery.txt нет, или я не прав smile
PM MAIL   Вверх
chaos
Дата 22.8.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



прав, он как раз и сигнализирует о том что файл заблокированн
PM WWW   Вверх
study
Дата 22.8.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 20.9.2004

Репутация: нет
Всего: нет



значит, если другая программа захочеть открыть файл delivery.txt ей это удастся smile

Мой пример вроде работает, только я не доконца его понимаю.
PM MAIL   Вверх
sharq
Дата 22.8.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



study это стандартная блокировка файла (из Perl-рецептов).
Скрипт будет ждать до тех пор, пока процесс, поставивший блок, не завершиться, т.е. пока не закончится работа с файлом, как только процесс завершился, скрипт получает доступ к файлу.

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

Если интересно можешь, посмотреть вариант блокировки файлов без использование функции flock - одноименная статья лежит в faq'e.

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
study
Дата 23.8.2005, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 20.9.2004

Репутация: нет
Всего: нет



Спасибо почитаю smile
PM MAIL   Вверх
rcdimon
Дата 25.8.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Обычно блокировка идет через семафор. Файл- семафор. И блокируется он, а не непосредственно тот с которым работаешь. Потому что могут произойти ошибки и при блокеровке и при проверки ее. И содержимое файла может быть нарушено. А в Файле-семафоре- содержимое не играет роли.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0731 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.