/* ...здесь использование заблокированного участка... */
lseek(fd, curpos, SEEK_SET); / * Вернуться к началу блокировки */
lockf(fd, F_ULOCK, len); /* Разблокировать файл */
Если вы не освободите блокировку явным образом, операционная система сделает это за вас в двух случаях. Первый случай, когда процесс завершается (либо при возвращении из main()
exit(), которую мы рассматривали в разделе 9.1.5.1 «Определение статуса завершения процесса»). Другим случаем является вызов close() с дескриптором файла: больше об этом в следующем разделе.14.2.2.3. Предостережения по поводу блокировок
Имеется несколько предостережений, о которых нужно знать при блокировках файлов:
• Как описано ранее, вспомогательная блокировка является именно этим. Не взаимодействующий процесс может делать все, что хочет, за спиной (так сказать) процесса, осуществляющего блокировку.
• Эти вызовы
. Эта библиотека осуществляет свое собственное буферирование. Хотя вы можете получить с помощью fileno() дескриптор нижележащего файла, действительное положение в файле может быть не там, где вы думаете. В общем, стандартная библиотека ввода/вывода не понимает блокировок файлов.• Держите в уме, что блокировки после fork
exec.• Вызов close()
То, что close()
fcntl(), POSIX ее стандартизует. Стандартизация такого поведения позволяет избежать порчи существующего кода для Unix.14.2.3. Блокирование BSD: flock()
4.2 BSD представило свой собственный механизм блокировки, flock()
#include
int flock(int fd, int operation);
Дескриптор fd
LOCK_SH
LOCK_EX
LOCK_UN
LOCK_NB
LOCK_SH или LOCK_EX позволяет избежать блокирования функции, если блокировка файла невозможна.По умолчанию запросы блокировки файла будут блокировать функцию (не давать ей вернуться), если существует конкурирующая блокировка. Запрашивающая функция возвращается, когда конкурирующая блокировка файла снимается и осуществляется запрошенная функцией блокировка файла. (Это предполагает, что по умолчанию имеется возможность возникновения тупика.) Чтобы попытаться заблокировать файл без блокирования функции, добавьте посредством побитового ИЛИ значение LOCK_NB
operation.Отличительными моментами flock()
• Блокировка с помощью flock()
flock().• Блокируется весь файл. Нет механизма для блокировки только части файла.
• То, как был открыт файл, не влияет на тип блокировки, который может быть использован. (Сравните это с fcntl()
• Несколько открытых для одного и того же файла дескрипторов используют совместную блокировку. Для удаления блокировки может использоваться любой из них. В отличие от fcntl()
• Процесс может иметь лишь одну блокировку файла с помощью flock()
flock() с двумя различными типами блокировок изменяет тип блокировки на новый.• На системах GNU/Linux блокировки flock()
fcntl(). Многие коммерческие системы Unix реализуют flock() в виде «оболочки» поверх fcntl(), но их семантика различается.Мы не рекомендуем использовать flock()