Блокировка файлов в Linux
Linux поддерживает все типы блокирования: обязательные и рекомендательные блокировки, а также системные вызовы fcnti и flock (lockf реализован в виде стандартной библиотечной функции).
Ожидаемое поведение системного вызова flock о в любой Unix-подобной операционной системе заключается в постановке только рекомендательных блокировок, независимо от состояния флага монтирования ms mandlock. Однако в Linux есть специальный вид обязательной блокировки, реализуемой в flock о, которая используется для поддержки ряда проприетарных сетевых файловых систем. Речь идет о так называемой обязательной блокировке в совместном режиме. Когда она установлена, никакому другому процессу не разрешено открывать файл, если это приведет к конфликту с режимом доступа, определенным блокировкой. Не следует пользоваться этой возможностью в приложениях, ориентированных на традиционные Unix-системы, поскольку исходный код не будет переносимым.
В Linux был введен еще один вид блокировки, основанный на fcntio и названный арендой. Когда процесс пытается открыть файл, защищенный блокировкой "аренда”, он блокируется, как обычно. Однако процесс, владеющий блокировкой, получает сигнал. Будучи проинформированным, он должен вначале обновить файл, чтобы его содержимое было непротиворечивым, а затем — снять блокировку. Если он не сделает этого в течение строго определенного времени (указанного в файле /proc/sys/fs/lease-break-time в секундах; как правило, 45 секунд), блокировка автоматически снимается ядром, и заблокированный процесс может продолжать работу.
Процесс может получить или освободить рекомендательную блокировку файла двумя способами:
- выполнив системный вызов flock . Параметрами этого вызова являются дескриптор файла fd и команда, уточняющая операцию блокировки. Блокировка будет относиться ко всему файлу;
- произведя системный вызов fcnti . Параметрами этого вызова являются дескриптор файла fd, команда, уточняющая операцию блокировки, и указатель на структуру flock. Некоторые поля этой структуры позволяют процессу указать блокируемый участок файла. Таким образом, процессы могут устанавливать несколько блокировок на разных участках одного файла.
Как f cnti о, так и flock о могут быть использованы с одним и тем же файлом, причем одновременно. Однако файл, заблокированный с помощью системного вызова fcnti о, не выглядит таковым для fiocko, и наоборот. Это сделано намеренно, чтобы избежать взаимных блокировок в ситуации, когда приложение, использующее один тип блокировки, зависит от библиотеки, использующей другой тип.
Обработка обязательных блокировок файлов происходит чуть сложнее. Необходимо выполнить следующие действия:
1. Смонтировать файловую систему, в которой требуется обязательная блокировка, с указанием опции -о mand команды mount. В результате будет установлен флаг ms mandlock в системном вызове mount . По умолчанию обязательная блокировка отключена.
2. Пометить файлы как кандидаты на обязательную блокировку, установив для них бит SGID (установка идентификатора группы) и сбросив бит прав группы на выполнение файла. Поскольку значение бита установки идентификатора группы не имеет смысла, когда бит прав группы на выполнение файла сброшен, ядро воспринимает такую комбинацию, как намек на то, что нужно использовать обязательные блокировки вместо рекомендательных.
3. Сделать системный вызов fcnti о, чтобы установить или снять блокировку файла.
Обработка блокировок типа аренда” намного проще, чем обработка обязательных блокировок. Достаточно сделать системный вызов fcnti с командой F SETLEASE ИЛИ F GETLEASE. ПОВТОРНЫЙ ВЫЗОВ fcntl, ВЫПОЛНеННЫЙ С
командой f setsig, может быть использован для изменения типа сигнала, посылаемого процессу-держателю блокировки аренда”.
Помимо проверок, выполняемых в системных вызовах read и write , ядро учитывает наличие обязательных блокировок при обслуживании любых системных вызовов, которые могут изменить содержимое файла. Например, системный вызов open о с установленным флагом o trunc завершится с ошибкой, если для файла установлена обязательная блокировка.
В следующем разделе описывается основная структура данных, используемая ядром для обработки блокировок файлов, установленных с помощью системного вызова flock о (блокировок fl flock) и системного вызова fcnti о (блокировок FLPOSIX).
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница