Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

LOCKF(3C)

НАЗВАНИЕ
lockf - блокировка сегментов файла

СИНТАКСИС


	#include <unistd.h>

	

	int lockf (fildes, function, size)

	long size;

	int fildes, function;

ОПИСАНИЕ
Функция lockf позволяет блокировать отдельные сегменты файла. Учитывать ли блокировку при записи, определяется режимом доступа к файлу [см. chmod(2)]. Если другие процессы попытаются блокировать уже заблокированный фрагмент, они либо получат в ответ код ошибки, либо будут ждать освобождения ресурса. При завершении процесса все блокировки, установленные им, удаляются. Более подробная информация о блокировке приведена в fcntl(2).

Аргумент fildes - это дескриптор открытого файла. Чтобы функция lockf завершилась успешно, файл должен быть открыт с правом записи (O_WRONLY или O_RDWR).

Аргумент function - это значение, задающее вполняемые действия. Допустимые значения определены во включаемом файле <unistd.h>:


	#define F_ULOCK 0 /* Разблокировать ранее блокированный

	                     сегмент */

	#define F_LOCK  1 /* Заблокировать сегмент */

	#define F_TLOCK 2 /* Проверить и заблокировать сегмент */

	#define F_TEST  3 /* Проверить сегмент */

Другие значения function зарезервированы для будущих расширений и приводят к ошибке, если не реализованы.

Значение F_TEST используется для определения того, не блокирован ли соответствующий сегмент файла каким-нибудь другим процессом. F_LOCK и F_TLOCK блокируют указанный сегмент, если это возможно. F_ULOCK разблокирует ранее блокированный сегмент.

Аргумент size задает количество последовательных байт файла, которые должны быть заблокированы или разблокированы. Началом сегмента является текущая позиция в файле; сегмент распространяется вперед или назад по файлу, в зависимости от положительного или отрицательного значения size (при распространении назад текущая позиция не включается в блокируемую или разблокируемую область). Если значение size равно 0, блокируется (или разблокируется) сегмент от текущей позиции до конца файла (текущего и любого будущего). Блокируемый сегмент не обязан существовать в файле, допустима блокировка областей за концом файла.

Сегменты, блокируемые посредством F_LOCK и F_TLOCK, могут полностью или частично пересекаться с сегментами, ранее блокированными тем же процессом. При обнаружении такого пересечения, а также при обнаружении смежных сегментов, создается один блокируемый сегмент, охватывающий все смежные байты. Если при блокировании создается новый блокируемый сегмент, он заносится в таблицу блокировок; при нехватке места в этой таблице обращение к lockf завершается неудачей и блокировка не устанавливается.

Запросы F_LOCK и F_TLOCK отличаются только действиями, которые производятся в случае, если блокировку осуществить невозможно. F_LOCK приводит к ожиданию освобождения ресурса. Запрос F_TLOCK, если сегмент уже блокирован другим процессом, приводит к возврату значения -1 и присваивания переменной errno значения EACCES.

Запрос F_ULOCK может полностью или частично разблокировать один или более сегментов, заблокированных вызывающим процессом. Если сегмент разблокируется не полностью, остаток остается блокированным. Разблокирование середины сегмента требует дополнительного элемента в таблице блокировок. При нехватке места в этой таблице происходит неудача, переменной errno присваивается значение EDEADLK и разблокировка не производится.

Если процесс, захвативший ресурс, ждет освобождения другого ресурса другим процессом, может возникнуть тупик, поэтому lockf и fcntl контролируют возможность образования тупика, прежде чем начать ожидание ресурса. Если обнаруживается, что ожидание ресурса вызовет тупик, выдается ошибка.

Ожидание ресурса может быть прервано произвольным сигналом. Для применений, в которых требуется временной контроль, рекомендуется пользоваться системным вызовом alarm(2).

Функция lockf завершается неудачей, если выполнено хотя бы одно из следующих условий:
[EBADF] Аргумент fd не является корректным дескриптором открытого файла.
[EACCES] Значение function равно F_TLOCK или F_TEST, а сегмент уже блокирован другим процессом.
[EDEADLK] Значение function равно F_LOCK и может создаться тупик, или значение function равно F_LOCK, F_TLOCK или F_ULOCK, а в таблице блокировок не хватает места.
[ECOMM] Fildes является дескриптором файла на удаленном компьютере, связи с которым в данный момент нет.

СМ. ТАКЖЕ
chmod(2), close(2), creat(2), fcntl(2), intro(2), open(2), read(2), write(2).

ДИАГНОСТИКА
При успешном завершении результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки.

ПРЕДОСТЕРЕЖЕНИЯ
Для процесса, который занимается буферизацией ввода/вывода в адресном пространстве пользователя, результаты взаимодействия с механизмом блокировки могут оказаться непредсказуемыми: запись в заблокированный сегмент пройдет нормально, зато потом запись совсем в другое место может привести к ошибке из-за выталкивания буферов. Главным источником неожиданной буферизации является стандартный пакет ввода/вывода.

Так как в будущем переменной errno будет присваиваться значение EAGAIN, вместо значения EACCES в случае, если сегмент файла уже блокирован другим процессом, для достижения мобильности прикладных программ следует ожидать и обрабатывать оба кода ошибки.

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...