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>, после чего снимает блокировку и закрывает файл.

Листинг 8.2. (lock-file.c) Установка блокировки записи с помощью функции fcntl()

#include <fcntl.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

int main(int argc, char* argv[]) {

 char* file = argv[1];

 int fd;

 struct flock lock;

 printf("opening %s ", file);

 /* Открытие файла. */

 fd = open(file, O_WRONLY);

 printf("locking ");

 /* инициализация структуры flock. */

 memset(&lock, 0, sizeof(lock));

 lock.l_type = F_WRLCK;

 /* Установка блокировки записи. */

 fcntl(fd, F_SETLKW, &lock);

 printf("locked; hit Enter to unlock... ");

 /* Ожидание нажатия клавиши <Enter>. */

 getchar();

 printf("unlocking ");

 /* Снятие блокировки. */

 lock.l_type = F_UNLCK;

 fcntl(fd, F_SETLKW, &lock);

 close(fd);

 return 0;

}

Скомпилируйте программу и запустите ее с каким-нибудь тестовым файлом, скажем, /tmp/test-file:

% cc -o lock-file lock-file.с

% touch /tmp/test-file

% ./lock-file /tmp/test-file

opening /tmp/test-file

locking

locked; hit Enter to unlock...

Теперь откройте другое окно и вызовите программу еще раз с тем же файлом:

% ./lock-file /tmp/test-file

opening /tmp/test-file

locking

Пытаясь поставить блокировку на файл, программа сама окажется заблокированной. Вернитесь в первое окно и нажмите <Enter>:

unlocking

В результате программа, запущенная во втором окне, немедленно продолжит свою работу. Если необходимо, чтобы функция fcntl() не переходила в режим ожидания в случае, когда блокировку поставить невозможно, задайте в качестве кода операции константу F_SETLCK, а не F_SETLKW. Если функция обнаружит, что запрашиваемый файл уже заблокирован, она немедленно вернет -1.

В Linux имеется системный вызов flock(), также реализующий операцию блокирования файла. Но у функции fcntl() есть большое преимущество: она работает с файловыми системами NFS[28] (при условии, что сервер NFS имеет относительно недавнюю версию и сконфигурирован правильно). Так что. имея доступ к двум компьютерам, которые монтируют одну и ту же файловую систему через NFS, можно повторить показанный выше пример на двух разных машинах.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Операции с файлами и папками. Проводник

Из книги Windows Vista автора Леонтьев Виталий Петрович

Операции с файлами и папками. Проводник Что ж, если мы уже вошли в мир файлов и папок, давайте посмотрим на содержимое нашего компьютера… На логическую структуру жесткого диска. Вся информация хранится в файлах, файлы – в папках, папки – на жестких дисках. Все вроде


1. Файлы. Операции с файлами

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

1. Файлы. Операции с файлами Введение файлового типа в язык Pascal вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных.Файловый тип данных (или файл) определяет упорядоченную


14. Файлы. Операции с файлами

Из книги Информатика и информационные технологии автора Цветкова А В

14. Файлы. Операции с файлами Файловый тип данных определяет упорядоченную совокупность однотипных компонент.При работе с файлами выполняются операции ввода-вывода. Операция ввода – это перепись данных с внешнего устройства в память, операция вывода – пересылка данных


Операции с файлами и папками

Из книги Работа на ноутбуке автора Садовский Алексей

Операции с файлами и папками Одно из главных достоинств графического интерфейса – поддержка технологии Drag and Drop (дословно «перетащил и кинул»). Суть идеи заключается в том, что, выделив какой-либо объект в окне (или на Рабочем столе), а затем щелкнув на нем левой или правой


Урок 2.6. Операции с файлами и папками

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Урок 2.6. Операции с файлами и папками Просмотр свойств объектов Для получения основных сведений о файле или папке достаточно щелкнуть на нем в окне папки кнопкой мыши – и основная информация появится на панели подробностей, которая расположена в нижней части окна. Для


Операции с файлами и папками

Из книги Windows Vista автора Вавилов Сергей

Операции с файлами и папками Наличие двух панелей позволяет легко и наглядно копировать или перемещать файлы.Последовательность действий при копировании или перемещении будет следующей.1. Откройте на одной из панелей папку, в которую нужно скопировать объект.2.


Операции с файлами и папками

Из книги Самоучитель работы на компьютере автора Колисниченко Денис Николаевич

Операции с файлами и папками В данном разделе мы рассмотрим важнейшие операции, которые можно выполнять с файлами и папками, хранящимися на компьютере, а также поговорим о том, как создавать новые объекты, записывать файлы на компакт-диск, flash-память и


7.6. Основные операции с файлами и папками

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

7.6. Основные операции с файлами и папками 7.6.1. Просмотр содержимого каталога Итак, начнем обзор нашей файловой системы. Откройте окно Мой компьютер (рис. 51) — вы увидите список дисков. Если щелкнуть на произвольном диске один раз, то слева вы увидите сводную информацию о


7.6.2. Операции с файлами

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

7.6.2. Операции с файлами Щелкните на любом файле правой кнопкой мыши. Вы увидите всплывающее меню (рис. 53):Открыть — будет вызвана программа, связанная с этим файлом, и в нее будет загружен выбранный файл. Это действие является действием по умолчанию (в меню оно выделено


Операции с файлами

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Операции с файлами В состав класса CFile входят методы, позволяющие выполнять над файлами различные операции, например копирование, переименование, удаление, изменение атрибутов.Операционная система MS-DOS содержит команду REN, позволяющую переименовывать файлы. Класс CFile


Операции над файлами

Из книги Операционная система UNIX автора Робачевский Андрей М.

Операции над файлами Функция Краткое описание access определение прав доступа к файлу chmod изменение прав доступа к файлу filelength измерение длины файла isatty проверка, является ли устройство символьным mktemp генерация уникального имени файла remove уничтожение


Операции блокировки

Из книги Самоучитель работы на компьютере: быстро, легко, эффективно автора Гладкий Алексей Анатольевич

Операции блокировки Для семафора определены три модификации операции блокировки:int sem_wait(sem_t* sem);int sem_trywait(sem_t* sem);#include <time.h>int sem_timedwait(sem_t* sem, const struct timespec * abs_timeout);Все эти функции опираются на функцию (native QNX API):int SyncSemWait(sync_t* sync, int try);Функция простого ожидания sem_wait() пытается


Функция fcntl(2)

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Функция fcntl(2) После открытия файла и получения ссылки на него в виде файлового дескриптора процесс может производить различные файловые операции. Функция fcntl(2) позволяет процессу выполнить ряд действий с файлом, используя его дескриптор, передаваемый в качестве первого


7.11. Функция fcntl

Из книги автора

7.11. Функция fcntl Сокращение fcntl означает «управление файлами» (file control). Эта функция выполняет различные операции управления дескрипторами. Перед описанием этой функции и ее влияния на сокет нам нужно составить некоторое более общее представление о ее возможностях. В табл.


17.4. Операции с файлами

Из книги автора

17.4. Операции с файлами Следующая группа вызовов начинается с FIO и может применяться к определенным типам файлов в дополнение к сокетам. Мы рассматриваем только вызовы, применимые к сокетам [128, с. 553].Следующие пять вызовов требуют, чтобы третий аргумент функции ioctl указывал