Linux Kernel (Ядро линукса) (часть 2)


Сегодня очень актуальны бани хамам. Компания "А-Строй"-это индивидуальный подход к каждому заказчику. Залог качества выполненных работ с использованием современного оборудования.

Блокировки FL_POSIX

Блокировка fl posix всегда связана с процессом и индексным дескриптором; она автоматически снимается, когда процесс заканчивает выполнение, или дескриптор файла закрывается (даже если процесс открыл один файл дважды или создал копию дескриптора файла). Кроме того, блокировки fl posix никогда не наследуются потомком через fork о.

Когда системный вызов fcnti О используется для блокировки файлов, он работает с тремя параметрами: с дескриптором fd файла, на который следует воздействовать; с параметром cmd, задающим операцию блокировки; указателем fi на структуру flock, которая хранится в адресном пространстве процесса режима пользователя. Поля этой структуры описаны в табл. 12.20.

В Linux определена также структура flock64, в которой поля offset и length являются 64-битовыми целыми. В последующем изложении мы говорили о структуре flock, но сказанное справедливо и в отношении flock64.

Служебная процедура sys fcnti о ведет себя в зависимости от значения флага, установленного в параметре cmd:

- f getlk — определяет, конфликтует ли блокировка, описанная структурой flock, с какой-либо блокировкой fl posix, уже полученной другим процессом. В таком случае в структуру flock записывается информация о существующей блокировке;
- f setlk — устанавливает блокировку, описанную структурой flock. Если блокировка не может быть получена, системный вызов возвращает код ошибки;
- f setlkw — устанавливает блокировку, описанную структурой flock. Если блокировка не может быть получена, системный вызов блокирует вызвавший процесс, т. е. процесс приостанавливается, пока блокировка не станет доступной;
- F_GETLK64, F_SETLK64, F_SETLKW64 анаЛОГИЧИЫ Предыдущим, НО ИСПОЛЬ-
зуют структуру f 1оскб4, а не flock.

Служебная процедура sys fcntio вначале получает файловый объект, соответствующий параметру fd, а затем вызывает fcntigetiko или fcnti setiko, в зависимости от команды, переданной в качестве параметра (f getlk для первой функции и f setlk или f setlkw для второй). Мы рассмотрим только последний случай.

Функция fcnti setiko принимает три параметра: fiip, указатель на файловый объект, команду cmd (f setlk или f setlkw) и указатель на структуру flock. Функция выполняет следующие действия:
1. Считывает структуру, на которую указывает параметр f 1, в локальную переменную типа flock.
2. Выясняет, должна ли блокировка быть обязательной, и есть ли у файла совместно используемое отображение в память. В этом случае функция отказывается создать блокировку и возвращает код ошибки -eagain, поскольку с файлом уже работает другой процесс.
3. Инициализирует новую структуру fiie iock в соответствии с содержимым пользовательской структуры flock и с размером файла, указанным в индексном дескрипторе файла.
4. Если указана команда f setlkw, функция устанавливает флаг fl sleep В поле fl_f lags структуры file_lock.
5. Если поле l type структуры flock равно f rdlck, функция проверяет, есть ли у процесса право на чтение файла. Аналогичным образом, если l type равно f wrlck, проверяется право на запись в файл. Если такого права нет, возвращается код ошибки.
6. Вызывает метод lock из числа файловых операций, если он определен. Как правило, в дисковых файловых системах этот метод не определен.
7. Вызывает функцию posix_iock_fiie о, передавая ей в качестве параметров адрес объекта "индексный дескриптор" данного файла и адрес объекта f iie iock. В свою очередь, эта функция выполняет следующие действия:
• вызывает posix_iocks_confiicts о для каждой блокировки fl posix из списка блокировок данного индексного дескриптора. Вызванная функция проверяет, не конфликтует ли блокировка с запрошенной. Суть в том, что в списке индексного дескриптора не должно быть блокировок fl posix на запись для той же области, и не может быть никаких блокировок fl posix для этой области, если процесс запрашивает блокировку на запись. Однако блокировки, принадлежащие одному процессу, не конфликтуют, что позволяет процессу менять характеристики принадлежащих ему блокировок;
• если конфликтующая блокировка найдена, функция проверяет, был ли системный вызов fcnti сделан с флагом f setlkw. Если это так, текущий процесс должен быть приостановлен. В этом случае функция вызывает posix_iocks_deadiock, чтобы проверить, нет ли состояния вза- имной блокировки у процессов, ожидающих блокировки fl posix. Затем она заносит новую блокировку (ждущую) в список, принадлежащий конфликтующей (задерживающей) блокировки, и в список задержанных блокировок, после чего возвращает код ошибки. В противном случае, если системный вызов fcntio сделан с флагом f setlk, функция просто возвращает код ошибки;
• если окажется, что список блокировок данного индексного дескриптора не содержит ни одной конфликтующей блокировки, функция проверяет все блокировки fl posix текущего процесса, затрагивающие область файла, которую текущий процесс хочет заблокировать, и объединяет или разбивает на части области файла, вовлеченные в эту ситуацию. Например, если процесс запросил блокировку на запись для области файла, расположенной внутри более широкой области, заблокированной на чтение, то предыдущая блокировка на чтение разделяется на две, относящиеся к крайним участкам, а на центральный участок накладывается новая блокировка на запись. В случае перекрытия областей более новые блокировки всегда заменяют старые;
• заносит новую структуру file_lock в глобальный список блокировок файлов и в список индексного дескриптора;
• возвращает 0 (успешное завершение).
8. Проверяет код возврата функции posix iock f iie :
• если возвращен 0 (нет конфликтующих блокировок), возвращает О (успешное завершение);
• обнаружена несовместимость. Если флаг fl sleep в поле fi fiags сброшен, функция освобождает дескриптор file lock и возвращает
-eagain;
• в противном случае, когда несовместимость есть, но процесс может быть приостановлен, функция вызывает wait_event_interruptible, чтобы занести текущий процесс в очередь iock->fi_wait и приостановить его. Когда выполнение процесса будет возобновлено (сразу после снятия задерживающей блокировки), функция переходит к шагу 7 и пытается повторить операцию.

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...