Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

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
, которую мы рассматривали в разделе 9.1.5.1 «Определение статуса завершения процесса»). Другим случаем является вызов
close
с дескриптором файла: больше об этом в следующем разделе.

14.2.2.3. Предостережения по поводу блокировок

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

• Как описано ранее, вспомогательная блокировка является именно этим. Не взаимодействующий процесс может делать все, что хочет, за спиной (так сказать) процесса, осуществляющего блокировку.

• Эти вызовы не следует использовать в сочетании с библиотекой

<stdio.h>
. Эта библиотека осуществляет свое собственное буферирование. Хотя вы можете получить с помощью
fileno
дескриптор нижележащего файла, действительное положение в файле может быть не там, где вы думаете. В общем, стандартная библиотека ввода/вывода не понимает блокировок файлов.

• Держите в уме, что блокировки после

fork
не наследуются порожденными процессами, но они остаются на своем месте после
exec
.

• Вызов

close
с любым открытым для файла дескриптором удаляет все блокировки файла процессом, даже если другие дескрипторы для файла остаются открытыми.

То, что

close
работает таким образом, является неудачным, но поскольку так была реализована первоначальная блокировка в
fcntl
, POSIX ее стандартизует. Стандартизация такого поведения позволяет избежать порчи существующего кода для Unix.

14.2.3. Блокирование BSD:

flock

4.2 BSD представило свой собственный механизм блокировки,

flock
[155] . Функция объявлена следующим образом:

#include <sys/file.h> /* Обычный */

int flock(int fd, int operation);

Дескриптор

fd
представляет открытый файл. Имеются следующие операции:

LOCK_SH
Создает совместную блокировку. Может быть несколько совместных блокировок.

155

Удачно, что название

flock
отличается от
lockf
, поскольку их семантика различна. Это также страшно сбивает с толку. Держите свое руководство под рукой. — Примеч. автора.

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
в новых программах, поскольку ее семантика не такая гибкая и поскольку она не стандартизована POSIX. Поддержка ее в GNU/Linux осуществляется главным образом для обратной совместимости с программным обеспечением, написанным для старых систем BSD Unix.

ЗАМЕЧАНИЕ. Справочная страница GNU/Linux flock(2) предупреждает, что блокировки

flock
не работают для смонтированных удаленных файлов. Блокировки
fcntl
работают, при условии, что у вас достаточно новая версия Linux и сервер NFS поддерживает блокировки файлов

14.2.4. Обязательная блокировка

Большинство коммерческих систем Unix поддерживают в дополнение к вспомогательной обязательную блокировку файлов. Обязательная блокировка работает лишь с

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

Поделиться:
Популярные книги

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

Любимая учительница

Зайцева Мария
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Любимая учительница

Матабар V

Клеванский Кирилл Сергеевич
5. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар V

Двойник короля 11

Скабер Артемий
11. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 11

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Моров. Том 5

Кощеев Владимир
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 5

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2

Я – Легенда 2: геном хищника

Гарцевич Евгений Александрович
2. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Я – Легенда 2: геном хищника

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

Точка Бифуркации IX

Смит Дейлор
9. ТБ
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Точка Бифуркации IX

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2