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, можно повторить показанный выше пример на двух разных машинах.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Операции блокировки
Операции блокировки Для семафора определены три модификации операции блокировки: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)
Функция fcntl(2) После открытия файла и получения ссылки на него в виде файлового дескриптора процесс может производить различные файловые операции. Функция fcntl(2) позволяет процессу выполнить ряд действий с файлом, используя его дескриптор, передаваемый в качестве первого
Операции с файлами и папками
Операции с файлами и папками В данном разделе мы рассмотрим важнейшие операции, которые можно выполнять с файлами и папками, хранящимися на компьютере, а также поговорим о том, как создавать новые объекты, записывать файлы на компакт-диск, flash-память и
7.11. Функция fcntl
7.11. Функция fcntl Сокращение fcntl означает «управление файлами» (file control). Эта функция выполняет различные операции управления дескрипторами. Перед описанием этой функции и ее влияния на сокет нам нужно составить некоторое более общее представление о ее возможностях. В табл.
17.4. Операции с файлами
17.4. Операции с файлами Следующая группа вызовов начинается с FIO и может применяться к определенным типам файлов в дополнение к сокетам. Мы рассматриваем только вызовы, применимые к сокетам [128, с. 553].Следующие пять вызовов требуют, чтобы третий аргумент функции ioctl указывал
Операции с файлами и папками. Проводник
Операции с файлами и папками. Проводник Что ж, если мы уже вошли в мир файлов и папок, давайте посмотрим на содержимое нашего компьютера… На логическую структуру жесткого диска. Вся информация хранится в файлах, файлы – в папках, папки – на жестких дисках. Все вроде
1. Файлы. Операции с файлами
1. Файлы. Операции с файлами Введение файлового типа в язык Pascal вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных.Файловый тип данных (или файл) определяет упорядоченную
Операции над файлами
Операции над файлами Функция Краткое описание access определение прав доступа к файлу chmod изменение прав доступа к файлу filelength измерение длины файла isatty проверка, является ли устройство символьным mktemp генерация уникального имени файла remove уничтожение
Операции с файлами
Операции с файлами В состав класса CFile входят методы, позволяющие выполнять над файлами различные операции, например копирование, переименование, удаление, изменение атрибутов.Операционная система MS-DOS содержит команду REN, позволяющую переименовывать файлы. Класс CFile
7.6. Основные операции с файлами и папками
7.6. Основные операции с файлами и папками 7.6.1. Просмотр содержимого каталога Итак, начнем обзор нашей файловой системы. Откройте окно Мой компьютер (рис. 51) — вы увидите список дисков. Если щелкнуть на произвольном диске один раз, то слева вы увидите сводную информацию о
7.6.2. Операции с файлами
7.6.2. Операции с файлами Щелкните на любом файле правой кнопкой мыши. Вы увидите всплывающее меню (рис. 53):Открыть — будет вызвана программа, связанная с этим файлом, и в нее будет загружен выбранный файл. Это действие является действием по умолчанию (в меню оно выделено
Операции с файлами и папками
Операции с файлами и папками Одно из главных достоинств графического интерфейса – поддержка технологии Drag and Drop (дословно «перетащил и кинул»). Суть идеи заключается в том, что, выделив какой-либо объект в окне (или на Рабочем столе), а затем щелкнув на нем левой или правой
Урок 2.6. Операции с файлами и папками
Урок 2.6. Операции с файлами и папками Просмотр свойств объектов Для получения основных сведений о файле или папке достаточно щелкнуть на нем в окне папки кнопкой мыши – и основная информация появится на панели подробностей, которая расположена в нижней части окна. Для
Операции с файлами и папками
Операции с файлами и папками Наличие двух панелей позволяет легко и наглядно копировать или перемещать файлы.Последовательность действий при копировании или перемещении будет следующей.1. Откройте на одной из панелей папку, в которую нужно скопировать объект.2.
14. Файлы. Операции с файлами
14. Файлы. Операции с файлами Файловый тип данных определяет упорядоченную совокупность однотипных компонент.При работе с файлами выполняются операции ввода-вывода. Операция ввода – это перепись данных с внешнего устройства в память, операция вывода – пересылка данных