Книга: Программирование для Linux. Профессиональный подход
8.3. Функция fcntl(): блокировки и другие операции над файлами
8.3. Функция fcntl(): блокировки и другие операции над файлами
Функция fcntl()
— это точка доступа к нескольким особым операциям над файлами. Первым аргументом функции является дескриптор файла, вторым указывается код операции. Для некоторых операций требуется также дополнительный, третий аргумент. В этом разделе описана наиболее распространенная операция, выполняемая с помощью функции fcntl()
: блокирование файлов.
Функция fcntl()
позволяет программе поставить на файл блокировку чтения иди записи. Это напоминает применение исключающих семафоров, которые описывались в главе 5, "Взаимодействие процессов". Блокировка чтения ставится на файл, доступный для чтения. Соответственно блокировка записи ставится на файл, доступный для записи. Несколько процессов могут удерживать блокировку чтения одного и того же файла, но только одному процессу разрешено ставить блокировку записи. Файл не может быть одновременно заблокирован и для чтения, и для записи. Учтите, что наличие блокировки не мешает другим процессам открывать файл и осуществлять чтение/запись его данных, если только они сами не попытаются вызвать функцию fcntl()
.
Прежде чем ставить блокировку на файл, необходимо создать и обнулить структуру типа flock
. В поле l_type
должна быть записана константа F_RDLCK
в случае блокировки чтения и константа F_WRLCK
— в случае блокировки записи. Далее следует вызвать функцию fcntl()
, передав ей дескриптор файла, код операции F_SETLCKW
и указатель на структуру типа flock
. Если аналогичная блокировка уже была поставлена другим процессом, функция fcntl()
перейдет в режим ожидания, пока "мешающая" ей блокировка не будет снята.
В листинге 8.2 показана программа, которая открывает для записи указанный файл, а затем ставит на него блокировку записи. Программа ждет нажатия клавиши <Enter>, после чего снимает блокировку и закрывает файл.
- Другие инструменты для осуществления резервного копирования
- Восстановление "безнадежных" баз данных. InterBase Surgeon
- 2.1.3. Функция getopt_long()
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- Надежность и безопасность
- Эффективная работа с временными файлами сортировки
- Группировка по встроенным функциям и UDF
- 2.5. Разработка технического задания на проведение детального анализа рынка при работе над инновационным проектом. Основ...
- Другие изменения в 7-й версии InterBase
- Операции с множествами узлов
- 19.1.1. Функция jQuery()
- Функция strcmp( )