- /dev/blog
- 25 нояб. 2015 г.
- Файловые блокировки в Linux
- Advisory locking
- BSD locks (flock)
- POSIX record locks (fcntl)
- Open file description locks (fcntl)
- Mandatory locking
- Замечания
- Обработка падений
- Удаление и переименование
- Русские Блоги
- блокировка файла linux
- Перепечатка:https://blog.csdn.net/rl529014/article/details/51336161
- Знание файлового дескриптора и индекса
- 1. Основная концепция блокировки файлов
- 2. Тип блокировки файла
- 3. Функция блокировки файлов
- 14.2. Блокировка файлов
- Читайте также
- 14.2. Блокировка файлов
- Ждущая блокировка
- Блокировка SuperFetch
- 15.17.4 Блокировка файлов
- 7.4. Блокировка и ожидание
- 9.4. Рекомендательная блокировка
- 9.5. Обязательная блокировка
- Блокировка слоев
- Блокировка строки
- Пессимистическая блокировка
- Блокировка слоев
- Блокировка слоев
- Блокировка
- Блокировка автофокуса
/dev/blog
25 нояб. 2015 г.
Файловые блокировки в Linux
Advisory locking
Рекоммендательные блокировки работают только тогда, когда процессы явно устанавливают или снимают блокировку. Они не влияют на процессы, которые ничего не знают о блокировках.
У всех блокировок есть два режима: exclusive и shared.
BSD locks (flock)
Это, в частности, позволяет избежать проблем с потоками (см. следующую секцию).
Однако, flock() не гарантирует атомарного переключения между режимами exclusive и shared. При изменении режима блокировки, flock() сначала отпускает ее, а затем ожидает возможности захватить ее с новым режимом.
POSIX record locks (fcntl)
- любые (даже несвязанные) файловые дескрипторы, отктрытые для одного и того же файла одним и тем же процессом, ссылаются на одну и ту же блокировку;
- как следствие, все потоки одного процесса также разделяют одну и ту же блокировку для каждого файла, т.к. имеют одинаковый pid;
- вызов close() для любого из открытых для файла дескрипторов снимает блокировку с файла, не зависимо от того, через какой дескриптор она была установленна и остаются ли у процесса другие открытые дескрипторы для этого файла.
- использовать open file description locks, которые доступны в современных ядрах Linux;
- использовать record locks и избежать открытия процессом одного и того же файла блокировки через несколько файловых дескрипторов.
- централизованно хранить все дескрипторы файлов блокировок, отрытые процессом, и не допускать открытия нескольких дескрипторов для одного файла;
- ассоциировать с каждым дескриптором rw-mutex, например pthread_rwlock, и счетчик количества потоков, захвативших блокировку одновременно (он будет больше единицы только при захвате в shared mode);
- для захвата блокировки сначала захватывать мьютекс и увеличивать счетчик; и только если счетчик был нулевой, захватывать и файловую блокировку;
- для освобождения блокировки уменьшать счетчик и только если он стал нулевым, освобождать и файловую блокировку; затем освобождать мьютекс.
Open file description locks (fcntl)
Другими словами, эти блокировки сочетают в себе достоинства BSD locks (привязка к файловому дескриптору) и POSIX record locks (блокировка интервала, атомарное переключение режима).
Mandatory locking
В Linux также есть ограниченная поддержака обязательных блокировок:
- обязательные блокировки задействуются только если они включены при монтировании раздела и для блокировки используются POSIX record locks;
- после захвата exclusive или shared блокировки любые системные вызовы, изменяющие файл (например write(), truncate()) будут блокированы до тех пор, пока блокировка не будет отпущена;
- после захвата exclusive блокировки, также буду блокироваться любые системные вызовы, читающие из файла.
Однако, реализация в Linux считается ненадежной, см. сецию «Mandatory locking» в fcntl(2):
- возможны гонки при одновременном захвате блокировки и параллельном вызове write() или read();
- возможны гонки при одновременном использовании с mmap().
Также, обязательные блокировки не решают проблемы, описанные в секции «Удаление и переименование» ниже.
Замечания
Обработка падений
Приятной особенностью всех видов блокировок (и flock() и fcntl()) является то, что блокировка автоматически снимается при завершении процесса, в том числе аварийном.
Другими словами, наличие блокировки гарантирует, что существует процесс, удерживающий ее.
Удаление и переименование
Ни рекоммендательные, ни обязательные блокировки не учитываются, когда выполняются вызовы unlink() или rename().
Также не получится устанавливать блокировку на каталог, из которого удаляется или перемещается файл, потому что блокировки можно устанавливать только на файлы.
В частности это означает, что с помощью обязательных блокировок невозможно защитить файл от удаление или перемещения.
Источник
Русские Блоги
блокировка файла linux
Перепечатка:https://blog.csdn.net/rl529014/article/details/51336161
Знание файлового дескриптора и индекса
Разница между fcntl (), lockf и flock
1. Основная концепция блокировки файлов
Программные и аппаратные ресурсы в Linux — это файлы (все файлы), и файлы доступны для совместного использования в многопользовательской среде.
Блокировка файла — это механизм решения совместного использования ресурсов: когда нескольким пользователям требуется предоставить общий доступ к файлу, Linux обычно применяет метод блокировки файла дляИзбегайте конкуренции между общими ресурсами。
Мы возьмем следующий пример, чтобы объяснить, почему необходимы блокировки файлов.
1. Процесс «A» открывает и читает файл, который содержит некоторую информацию, относящуюся к учетной записи.
2. Процесс «B» также открыл этот файл. И прочитайте информацию в файле.
3. Теперь процесс «А» изменяет запись оставшейся суммы в своей копии и записывает ее в файл.
4. В настоящее время процесс «B» не знает, что последнее чтение файла было изменено. Он также хранит копию исходного файла.
Тогда. Процесс «B» изменил ту же запись операции «A» и записал запись в файл.
5. В это время В файл будет сохранена только запись процесса «B» изменений.
Чтобы этого не происходило, необходимо использовать блокировки файлов для обеспечения «сериализации» операции.
2. Тип блокировки файла
Файловые блокировки включают рекомендуемые и обязательные блокировки:
Рекомендуемый замок:Каждый процесс, использующий файл, должен проверить, заблокирован ли файл. Если файл заблокирован, процесс не может ни читать, ни записывать, ни читать и записывать. Процесс не может остановить чтение и запись. При нормальных обстоятельствах ядро и система не используют консультативные блокировки, они полагаются на программистов для соблюдения этого правила.
Блокировка означает: существует ли какой-либо другой процесс, который в настоящее время читает и пишет
Обязательный замок:Это блокировка, выполняемая ядром. Когда файл заблокирован для записи, ядро предотвращает чтение и запись любых других файлов. Использование обязательных блокировок сильно влияет на производительность, и каждая операция чтения и записи должна проверять наличие блокировок.
3. Функция блокировки файлов
В Linux функциями, которые реализуют блокировку файлов, являются lockf () и fcntl ()
- lockf () используется для применения консультативной блокировки к файлу
- fcntl () может применять не только консультативные блокировки, но и принудительные блокировки.
- fcntl () также может заблокировать запись файла, то есть блокировку записи.
Блокировка записи может быть разделена на блокировку чтения и записи
Блокировка чтения: также известная как общая блокировка, она позволяет нескольким процессам устанавливать блокировку чтения для одной и той же части файла.
Блокировка записи: также известная как исключительная блокировка, только один процесс может установить блокировку записи в определенной части файла в любое время,Блокировка чтения и записи не могут быть установлены одновременно в одной и той же части файла.
Функция fcntl ()
fcntl — очень универсальная функция, которая может выполнять различные операции с открытыми файлами, включая управление блокировками файлов, получение и установку флагов дескриптора файла, получение и установку флагов состояния файла, Копирование файловых дескрипторов и многие другие функции,
Обязательные заголовочные файлы
#include
#include
#include
Прототип функции: int fcntl (int fd, int cmd, . );
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd, int cmd, struct flock *lock)
Входящее значение функции fd: дескриптор файла, управляемый параметром cmd
Функциональный прототип
int fcntl(int fd,int cmd,long arg);
int fcnt1(int fd, int cmd, struct flock *lock)
Входящее значение функции cmd
F_DUPFD: скопируйте существующий дескриптор, найдите доступный дескриптор, больший или равный arg, и используйте его как копию fd для возврата нового дескриптора
F_GETFD: Получить флаг дескриптора файла close-on-exec (закрытый во время выполнения) для fd. Если флаг не установлен, файл останется открытым после функции exec ()
F_SETFD: установить флаг закрытия при исполнении, который определяется битом FD_CLOEXEC параметра arg
F_GETFL: получить флаг, установленный открытием
F_SETFL: изменить флаг открытой настройки
F_GETLK: в зависимости от значения параметра блокировки решите, можно ли заблокировать файл
F_SETLK: установить блокировку файла значения параметра блокировки
О close_on_exec
close_on_exec — это битовый флаг всех файловых дескрипторов (файловых дескрипторов) процесса, каждый бит представляет открытый файловый дескриптор, используемый для определения при вызове системного вызова execve () Дескриптор файла, который нужно закрыть (см. Include / fcntl.h). Когда программа создает дочерний процесс, используя функцию fork (), она обычно вызывает функцию execve () в дочернем процессе, чтобы загрузить и выполнить другую новую программу. В это время подпроцесс будет полностью заменен новой программой, и новая подпрограмма будет выполнена в подпроцессе. Если соответствующий бит файлового дескриптора в close_on_exec установлен, то дескриптор будет закрыт при выполнении execve (), иначе дескриптор всегда будет открытым.
Функция входящего значения cmd
F_SETLKW: это блокирующая версия F_SETLK (W в названии команды означает ожидание). Когда он не может быть заблокирован, он перейдет в спящий режим, если он может быть заблокирован или сигнал получен, он вернется
lock: указатель на структуру стада, задающий конкретное состояние блокировки записи
Возвращаемое значение функции
В случае успеха возвращаемое значение зависит от второго параметра cmd
-1: ошибка
метод значений cmd
F_GETLK, F_SETLK или F_SETLKW: функция для получения / установки блокировки записи, возвращает 0 в случае успеха, -1 в случае ошибки и причина ошибки сохраняется в errno.
F_GETLK: проверить, можно ли использовать блокировку, описанную блокировкой. Если есть блокировка, которая предотвращает создание блокировки, описываемой блокировкой, то запишите информацию о существующей блокировке в структуру, на которую указывает блокировка (тип существующей блокировки l_type, номер процесса l_pid-locked) Если это не так, за исключением установки для l_type значения F_UNLCK, другая информация в структуре, на которую указывает блокировка, остается неизменной.
F_SETLK: установить или снять блокировку файла в соответствии с информацией о блокировке, описанной структурой стада, на которую указывает блокировка третьего параметра.
F_SETLK: используется для реализации общей (или чтения) блокировки (F_RDLCK) или эксклюзивной (записи) блокировки (F_WRLCK), которая также может удалить эти две блокировки (F_UNLCK). Если нельзя установить общую или монопольную блокировку, fcntl () немедленно вернется в EAGAIN
3. Примеры использования fcntl ()
В следующем примере сначала присвойте соответствующие значения соответствующим полям структуры стада.
Затем дважды используйте функцию fcntl (), чтобы определить, можно ли заблокировать файл и заблокировать связанный файл. Здесь используются значения cmd: F_GETLK и F_SETLK (или F_SETLKW) ,
Используйте команду F_GETLK, чтобы определить, может ли быть выполнена операция блокировки, описанная структурой стада:
Если блокировка может быть добавлена, l_type структуры стада будет установлен в F_UNLCK, а другие поля останутся неизменными;
В противном случае для l_pid задается номер процесса, которому принадлежит блокировка файла, для l_type указывается тип существующей блокировки, а другие поля остаются неизменными.
- Исходный код функции файла записи офиса выглядит следующим образом (файл сохраняется как mylock.c):
В следующем примере показан тестовый файл блокировки записи файла. Имя файла — wirte_lock.c.
Здесь сначала создается приветственный файл, затем к нему применяется блокировка записи и, наконец, снимается блокировка записи. Код выглядит следующим образом:
Запустите скриншот следующим образом:
Тест на ПК:
Откройте два терминала и запустите программу на обоих терминалах одновременно, чтобы добиться эффекта нескольких процессов, работающих с файлом.
Сначала запустите на клемме 1, затем запустите на клемме 2, обратите внимание на первую строку вывода на клемме 2.
Можно видеть, что блокировка записи является блокировкой мьютекса, и одновременно может существовать только одна блокировка записи.
Следующая программа представляет собой тестовый пример блокировки чтения файла, принцип такой же, как и в приведенной выше программе. Имя файла — read_lock.c.
Результаты следующие:
Также откройте два терминала и сначала запустите программу на терминале один, и результаты будут следующими:
Обратите внимание, что блокировка чтения является общей блокировкой.
Источник
14.2. Блокировка файлов
14.2. Блокировка файлов
Современные системы Unix, включая GNU/Linux, дают вам возможность заблокировать часть файла или весь файл для чтения или записи. Подобно многим частям Unix API, которые были разработаны после V7, имеется несколько несовместимых способов осуществить блокировку файлов. Данный раздел рассматривает эти возможности.
Читайте также
14.2. Блокировка файлов
14.2. Блокировка файлов Современные системы Unix, включая GNU/Linux, дают вам возможность заблокировать часть файла или весь файл для чтения или записи. Подобно многим частям Unix API, которые были разработаны после V7, имеется несколько несовместимых способов осуществить блокировку
Ждущая блокировка
Ждущая блокировка QNX предоставляет упрощенный вариант использования условной переменной для блокирования (остановки) потока при помощи интерфейса так называемой ждущей блокировки (sleepon). Для использования этого механизма не нужно явно создавать никаких объектов
Блокировка SuperFetch
Блокировка SuperFetch Функция SuperFetch позволяет ускорить работу системы за счет использования части оперативной памяти для кэширования данных, используемых при загрузке ОС и запуске приложений.В реестре за настройки функции отвечает ключ
15.17.4 Блокировка файлов
15.17.4 Блокировка файлов К некоторым файлам могут одновременно обратиться несколько пользователей. Например, конфигурационные файлы могут читаться несколькими процессами. Для изменения совместно используемого файла пользователь должен получить специальные полномочия
7.4. Блокировка и ожидание
7.4. Блокировка и ожидание Продемонстрируем теперь, что взаимные исключения предназначены для блокирования, но не для ожидания. Изменим наш пример из предыдущего раздела таким образом, чтобы потребитель запускался сразу же после запуска всех производителей. Это даст
9.4. Рекомендательная блокировка
9.4. Рекомендательная блокировка Блокировка записей по стандарту Posix называется рекомендательной. Ядро хранит информацию обо всех заблокированных различными процессами файлах, но оно не предотвращает запись в заблокированный на чтение процесс. Ядро также не
9.5. Обязательная блокировка
9.5. Обязательная блокировка Некоторые системы предоставляют возможность установки блокировки другого типа — обязательной (mandatory locking). В этом случае ядро проверяет все вызовы read и write, блокируя их при необходимости. Если для дескриптора установлен флаг O_NONBLOCK, вызов read или
Блокировка слоев
Блокировка слоев Блокировку слоев полезно применять в случаях, когда требуется редактирование объектов, расположенных на определенных слоях, с возможностью просмотра объектов на других слоях. Редактировать объекты на заблокированных слоях нельзя. Однако они остаются
Блокировка строки
Блокировка строки В MGA наличие ожидающих завершения новых версий строки имеет следствием блокировку строки. При большинстве условий наличие новой подтвержденной версии блокирует запрос на изменение или удаление этой строки — это конфликт блокировки.При получении
Пессимистическая блокировка
Пессимистическая блокировка В пессимистической блокировке СУБД строки, запрошенные одним пользователем или транзакцией для операции, которая может изменить состояние данных, немедленно становятся недоступными для чтения или записи другим пользователям или
Блокировка слоев
Блокировка слоев Блокировку слоев полезно применять в случаях, когда требуется редактирование объектов, расположенных на определенных слоях, с возможностью просмотра объектов на других слоях. Редактировать объекты на заблокированных слоях нельзя. Однако они остаются
Блокировка слоев
Блокировка слоев Блокировку слоев полезно применять в случаях, когда требуется редактирование объектов, расположенных на определенных слоях, с возможностью просмотра объектов на других слоях. Редактировать объекты на заблокированных слоях нельзя. Однако они остаются
Блокировка
Блокировка В состав класса CFile включены методы LockRange и UnlockRange, позволяющие заблокировать один или несколько фрагментов данных файла для доступа других процессов. Если приложение пытается повторно блокировать данные, уже заблокированные раньше этим или другим
Блокировка автофокуса
Блокировка автофокуса Если в поле зрения камеры находится несколько объектов, то как ей распознать, какой из них интересует фотографа? Чтобы подсказать камере, на чем она должна сфокусироваться, существует функция так называемого запирания (блокировки) автофокуса (Autofocus
Источник