lock.l_whence = ... ; /* Как раньше */lock.l_start = ... ; /* Как раньше */lock.l_len = ... ; /* Как раньше */lock.l_type = F_UNLCK; /* Разблокировать */if (fcntl(fd, F_SETLK, &lock) < 0) { /* обработать ошибку */}/* Блокировка была снята */Код, использующий
lockf()off_t curpos, len;curpos = lseek(fd, (off_t)0, SEEK_CUR); /* Получить текущее положение */len = ... ; / * Установить соответствующее число блокируемых байтов */lockf(fd, F_LOCK, len); / * Осуществить блокировку *//* ...здесь использование заблокированного участка... */lseek(fd, curpos, SEEK_SET); / * Вернуться к началу блокировки */lockf(fd, F_ULOCK, len); /* Разблокировать файл */Если вы не освободите блокировку явным образом, операционная система сделает это за вас в двух случаях. Первый случай, когда процесс завершается (либо при возвращении из
main()exit()close()14.2.2.3. Предостережения по поводу блокировок
Имеется несколько предостережений, о которых нужно знать при блокировках файлов:
• Как описано ранее, вспомогательная блокировка является именно этим. Не взаимодействующий процесс может делать все, что хочет, за спиной (так сказать) процесса, осуществляющего блокировку.
• Эти вызовы не следует использовать в сочетании с библиотекой
<stdio.h>fileno()• Держите в уме, что блокировки после
forkexec• Вызов
close()То, что
close()fcntl()14.2.3. Блокирование BSD:
flock()4.2 BSD представило свой собственный механизм блокировки,
flock()#include <sys/file.h> /* Обычный */int flock(int fd, int operation);Дескриптор
fdLOCK_SH LOCK_EX LOCK_UN LOCK_NB LOCK_SHLOCK_EXПо умолчанию запросы блокировки файла будут блокировать функцию (не давать ей вернуться), если существует конкурирующая блокировка. Запрашивающая функция возвращается, когда конкурирующая блокировка файла снимается и осуществляется запрошенная функцией блокировка файла. (Это предполагает, что по умолчанию имеется возможность возникновения тупика.) Чтобы попытаться заблокировать файл без блокирования функции, добавьте посредством побитового ИЛИ значение
LOCK_NBoperationОтличительными моментами
flock()• Блокировка с помощью
flock()flock()• Блокируется весь файл. Нет механизма для блокировки только части файла.
• То, как был открыт файл, не влияет на тип блокировки, который может быть использован. (Сравните это с
fcntl()• Несколько открытых для одного и того же файла дескрипторов используют совместную блокировку. Для удаления блокировки может использоваться любой из них. В отличие от
fcntl()• Процесс может иметь лишь одну блокировку файла с помощью
flock()flock()• На системах GNU/Linux блокировки
flock()fcntl()flock()fcntl()Мы не рекомендуем использовать
flock()ЗАМЕЧАНИЕ. Справочная страница GNU/Linux flock(2) предупреждает, что блокировки
flock()fcntl()14.2.4. Обязательная блокировка
Большинство коммерческих систем Unix поддерживают в дополнение к вспомогательной обязательную блокировку файлов. Обязательная блокировка работает лишь с
fcntl()chmod