Читаем Linux API. Исчерпывающее руководство полностью

В случае с вызовом flock() блокировка связывается только с дескриптором открытого файла и продолжает существовать, пока ее вручную не снимут или не будут закрыты все дескрипторы, ссылающиеся на описание открытого файла.

51.3.9. Зависание блокировок и приоритет отложенных запросов на их получение

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

Может ли процесс, пытающийся установить блокировку для записи, зависнуть из-за других процессов, которые устанавливают блокировки для чтения того же участка? В Linux (как и во многих других реализациях UNIX) это действительно может произойти, вызывая зависание блокировки для записи (возможно, даже навсегда).

Существуют ли какие-либо правила очередности получения блокировок в ситуации, когда их пытаются установить сразу несколько процессов? Например, выдаются ли они по принципу «первым пришел — первым ушел»? И зависят ли эти правила от типа блокировки, запрашиваемой каждым из процессов (то есть имеют ли блокировки для чтения приоритет перед блокировками для записи или наоборот)? В Linux действуют такие правила:

• порядок, в котором удовлетворяются отложенные запросы, является неопределенным. Если несколько процессов ожидают своей очереди для установки блокировки, порядок их выполнения зависит от планировщика ядра;

• записывающие блокировки не имеют приоритета перед считывающими и наоборот.

Эти утверждения могут оказаться неактуальными в других системах. В некоторых реализациях UNIX запросы на получение блокировок обслуживаются по принципу «первым пришел — первым ушел», а чтение имеет более высокий приоритет по сравнению с записью.

51.4. Строгая блокировка

Блокировки, которые мы обсуждали до сих пор, являлись необязательными. Это значит, что процесс может выполнять обычный ввод/вывод, не прибегая к вызову fcntl() (или flock()). Ядро не сможет помешать возникновению подобной ситуации. При использовании необязательных блокировок приложение само должно:

• установить для файла подходящего владельца (или группу) и права доступа, чтобы не дать неизвестному процессу выполнять для файла ввод/вывод;

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

Linux, как и многие другие реализации UNIX, позволяет делать блокировки записей, создаваемые вызовом fcntl(), строгими. Это значит, что каждая операция ввода/вывода проверяется на совместимость с любыми блокировками, удерживаемыми другими процессами для того же участка файла.

Режим необязательной блокировки иногда называют дискреционным, а строгий режим — принуждающим. Строгая блокировка не предусмотрена стандартом SUSv3, но доступна в большинстве современных UNIX-систем (с рядом отличий в реализации).

Чтобы задействовать строгую блокировку в Linux, ее нужно сначала включить на уровне файловой системы, в которой хранятся интересующие файлы. Для этого систему следует подключить, используя параметр — o mand (доступный только в Linux):

# mount — o mand /dev/sda10 /testfs

Внутри программы того же результата можно добиться с помощью флага MS_MANDLOCK при вызове mount(2) (см. подраздел 14.8.1).

Чтобы проверить, подключена ли файловая система с поддержкой строгой блокировки, можно проанализировать вывод команды mount(8), запущенной без параметров:

# mount | grep sda10

/dev/sda10 on /testfs type ext3 (rw,mand)

Строгая блокировка файла становится возможной, когда бит установки группового идентификатора включен, а групповое выполнение, наоборот, выключено. В старых UNIX-системах такое сочетание битов с правами доступа ничего не значило и попросту игнорировалось. Это позволило включать строгую блокировку без необходимости переписывания существующих программ или добавления новых системных вызовов. В командной оболочке данный вид блокировки можно включить следующим образом:

$ chmod g+s,g-x /testfs/file

Чтобы сделать то же самое в программе, файлу нужно назначить походящие права доступа, воспользовавшись вызовом hmod() или fchmod() (см. подраздел 15.4.7).

При выполнении команды ls(1) для файла, для которого была включена строгая блокировка, в столбце с правами доступа, касающимися группового выполнения, будет указано значение S:

$ ls — l /testfs/file

— rw-r-Sr- 1 mtk users 0 Apr 22 14:11 /testfs/file

Строгая блокировка поддерживается всеми стандартными системами в Linux и UNIX, однако ее сопровождение может отсутствовать в некоторых сетевых файловых системах или системах, не относящихся к семейству UNIX. Например, система VFAT компании Microsoft не поддерживает бит установки группового идентификатора, поэтому строгую блокировку в ней использовать нельзя.

Влияние строгой блокировки на операции ввода/вывода

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных