flock
Синтаксис
flock FILEHANDLE, OPERATION
Описание
Вызывает системную функцию flock или ее эмуляцию применительно к FILEHANDLE. Возвращает TRUE
в случае успеха и FALSE при ошибке. Вызов приведет к фатальной ошибке, если используется в
операционной системе, которая не поддерживает механизмов flock,
fcntl или lockf.
Сам по себе flock представляет собой переносимый механизм Perl, предназначенный для
реализации блокировки и ориентированный на блокировку файлов целиком (а не на уровне записей).
Аргумент OPERATION может принимать одно из значений: LOCK_SH, LOCK_EX или LOCK_UN, возможно
в комбинации с LOCK_NB. Эти константы традиционно равны 1, 2, 8 и 4 соответственно.
Назначение операций:
· LOCK_SH запрашивает блокировку режима совместного использования;
· L ОС К_Е X запрашивает блокировку для личного использования файла;
· LOCK_UN освобождает ранее запрошенную блокировку.
В случае если к кодам операции LOCK_SH или LОСК_ЕХ добавляется код LOCK_NB,то функция flock не ожидает
завершения операции блокировки, а немедленно возвращает управление в вызвавшую ее программу.
Следует иметь в виду, что эмуляция режима блокировки, реализуемая посредством lockf, не предусматривает
режима блокировки для совместного использования и, кроме того, требует, чтобы указатель FILEHANDLE
был открыт в режиме записи файла. Впрочем, большая часть операционных систем реализует механизм lockf
в соответствии с блокировкой fcntl.
Обратите также внимание, что некоторые версии flock не позволяют обеспечить блокировку в сетевых
файловых системах; для решения этой задачи вам потребуется использовать более системно-ориентированные
функции fcntl. При желании вы можете заставить Perl игнорировать системную реализацию функции flock и
использовать эмуляцию блокировки на основе функции fcntl.
ПРИМЕЧАНИЕ
Для этого потребуется перекомпилировать Perl, сконфигурировав его (программа Configure) с ключом -Ud_flock.
В качестве примера рассмотрим программу работы с почтовым ящиком в UNIX-системе.
use Fcntl ':flock'; # импортируем константы LOCK_*
sub lock {
flock(MBOX,LOCK_EX);
# и если что-то добавилось, пока мы
# ожидали...
seek(MBOX, 0, 2);
}
sub unlock {
flock(MBOX,LOCK_UN);
}
open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
or die "He могу открыть почтовый ящик: $!";
lock();
print MBOX $msg, "\n\n";
unlock();
Thanks
2023-11-16 22:30:18 Svetlana Thank you very useful information
Оставить комментарий:
|
|