FCNTL(2) FCNTL(2)
НАЗВАНИЕ
fcntl - управление файлами
СИНТАКСИС
#include
int fcntl (fildes, cmd, arg)
int fildes, cmd, arg;
ОПИСАНИЕ
Системный вызов fcntl выполняет управляющие операции
над открытыми файлами. Аргумент fildes - это дескриптор
открытого файла, полученный после выполнения системных
вызовов creat, open, dup, fcntl и pipe.
Аргумент cmd может принимать следующие значения, опре-
деляющие выполняемую операцию:
F_DUPFD
Создать новый дескриптор файла с такими свойства-
ми:
1. Его номер - есть минимальный из доступных номе-
ров, не меньших arg.
2. Он ассоциирован с тем же открытым файлом (или
каналом), что и исходный дескриптор fildes.
3. У него тот же указатель текущей позиции в фай-
ле, что и у исходного (то есть они разделяют
общий указатель).
4. Тот же режим доступа к файлу (чтение, запись
или чтение/запись).
5. Те же флаги статуса файла (то есть оба дескрип-
тора разделяют общие флаги статуса).
6. Ассоциированный с новым дескриптором флаг "зак-
рыть при выполнении вызова exec" устанавливает-
ся в состояние "оставить открытым при выполне-
нии вызова exec".
F_GETFD
Получить значение флага "закрыть при выполнении
вызова exec" для дескриптора файла fildes. Если
младший бит возвращаемого значения равен нулю, то
файл останется открытым, в противном случае при
выполнении вызова exec файл будет закрыт.
F_SETFD
Установить значение флага "закрыть при выполнении
вызова exec" для дескриптора файла fildes равным
значению младшего бита (0 или 1) аргумента arg.
F_GETFL
Получить флаги статуса файла, ассоциированного с
дескриптором fildes.
F_SETFL
Установить флаги статуса файла, ассоциированного с
дексриптором fildes, равными значению аргумента
arg. Могут быть установлены только некоторые флаги
[см. fcntl(5)].
F_GETLK
Получить характеристики первой блокировки, мешаю-
щей установить новую блокировку, задаваемую струк-
турой типа flock с адресом arg. Результирующая ин-
формация возвращается в той же структуре. Если нет
помех для создания нужной блокировки, то структура
flock не изменяется за исключением поля типа бло-
кировки, которому присваивается значение F_UNLCK.
F_SETLK
Установить или снять блокировку сегмента файла в
соответствии со значением структуры типа flock, на
которую указывает аргумент arg. [см. fcntl(5)].
Операция F_SETLK используется для установки блоки-
ровки на чтение (F_RDLCK) или запись (F_WRLCK), а
также для снятия блокировки обоих типов (F_UNLCK).
Если блокировка на чтение или запись не может быть
установлена, то системный вызов fcntl завершается
немедленно и возвращает -1.
F_SETLKW
Эта операция отличается от операции F_SETLK только
тем, что при неудачной попытке установить блоки-
ровку на чтение или запись процесс переходит в
состояние ожидания до тех пор, пока нужный сегмент
файла не будет разблокирован.
Блокировка на чтение предотвращает блокировку защищае-
мой области каким-либо процессом на запись. Для данного
сегмента файла могут одновременно существовать несколь-
ко блокировок на чтение. Дескриптор, используемый для
установления блокировки на чтение, должен быть ассоции-
рован с файлом, открытым с правом чтения.
Блокировка на запись предотвращает блокировку защищае-
мой области на чтение или запись. Одновременно может
существовать не более одной блокировки на запись данно-
го сегмента файла. Дескриптор, используемый для уста-
новления блокировки на запись, должен быть ассоциирован
с файлом, открытым с правом записи.
Структура типа flock содержит поля, определяющие для
сегмента файла тип блокировки (l_type), начальное сме-
щение (l_whence), относительное смещение (l_start),
размер (l_len), идентификатор системы РУФ (l_sysid),
идентификатор процесса (l_pid). Идентификаторы процесса
и системы используются только в случае операции F_GETLK
для возврата характеристик блокировки. Начало и конец
блокируемой области могут выходить за конец файла, но
не за начало. Можно определить блокировку, всегда дей-
ствующую до конца файла, если значение поля l_len равно
0. Если значения полей l_whence и l_start равны 0, то
блокировка будет распространяться на весь файл. Измене-
ние или снятие блокировки сегмента из середины большого
защищенного сегмента приводит к появлению с обоих кон-
цов двух меньших защищенных сегментов. Блокировка сег-
мента, который уже блокирован вызывающим процессом,
приводит к удалению старого и установке нового типа
блокировки. Все блокировки, ассоциированные с файлом
для данного процесса, удаляются, когда файл закрывается
этим процессом или когда процесс терминируется, не зак-
рывая файл. Блокировки не наследуются порождаемым про-
цессом при выполнении системного вызова fork(2).
Если блокировка доступа к файлу разрешена [см.
chmod(2)], то системные вызовы read и write для этого
файла выполняются с учетом действующих блокировок.
Системный вызов fcntl завершается неудачей, если выпол-
нено хотя бы одно из следующих условий:
[EBADF] Аргумент fildes не является корректным
дескриптором открытого файла.
[EINVAL] При операции cmd, равной F_DUPFD, значение
аргумента arg либо отрицательно, либо боль-
ше или равно максимально допустимому для
одного пользователя количеству дескрипторов
открытых файлов.
[EINVAL] При операции cmd, равной F_GETLK, F_SETLK
или F_SETLKW, значение аргумента arg или
информация, на которую указывает arg, не-
корректны.
[EACCES] При операции cmd, равной F_SETLK, делается
попытка блокировать на чтение (F_RDLCK)
сегмент файла, заблокированный другим про-
цессом на запись, либо попытка блокировать
на запись (F_WRLCK) сегмент файла, заблоки-
рованный другим процессом на чтение или за-
пись.
[ENOLCK] При операции cmd, равной F_SETLK или
F_SETLKW, превышается максимально допусти-
мое системой количество блокировок.
[EDEADLK] При операции cmd, равной F_SETLKW, ожидание
возможности установить блокировку приводит
к тупику.
[EFAULT] При операции cmd, равной F_SETLK, аргумент
arg указывает за пределы отведенного про-
цессу адресного пространства.
[EINTR] Во время выполнения системного вызова пе-
рехвачен сигнал.
[ENOLINK] Дескриптор fildes ассоциирован с файлом на
удаленном компьютере, связи с которым в
данный момент нет.
СМ. ТАКЖЕ
close(2), creat(2), dup(2), exec(2), fork(2), open(2),
pipe(2), fcntl(5).
ДИАГНОСТИКА
При успешном завершении системного вызова в зависимости
от операции cmd возвращаются следующие значения:
F_DUPFD Новый дескриптор файла.
F_GETFD Значение флага (определен только младший
бит).
F_SETFD Значение, отличное от -1.
F_GETFL Значение флагов статуса файла.
F_SETFL Значение, отличное от -1.
F_GETLK Значение, отличное от -1.
F_SETLK Значение, отличное от -1.
F_SETLKW Значение, отличное от -1.
В случае ошибки возвращается -1, а переменной errno
присваивается код ошибки.
ПРЕДОСТЕРЕЖЕНИЯ
Так как в будущем переменной errno будет присваиваться
значение EAGAIN вместо EACCES в случае, если сегмент
файла уже блокирован другим процессом, для достижения
мобильности прикладных программ следует ожидать и обра-
батывать оба кода ошибки.
FCNTL(5) FCNTL(5)
НАЗВАНИЕ
fcntl - флаги управления файлами
СИНТАКСИС
#include
ОПИСАНИЕ
Системный вызов fcntl(2) предназначен для управления
открытыми файлами. Во включаемом файле описа-
ны запросы и аргументы для системных вызовов fcntl(2) и
open(2).
/* Флаги, доступные open(2) и fcntl(2) */
/* Первые три флага могут быть установлены только при
открытии файла */
#define O_RDONLY 0
#define O_WRONLY 1
#define O_RDWR 2
#define O_NDELAY 04 /* Неблокируемый ввод/вывод */
#define O_APPEND 010 /* Добавлять (гарантируется, что
запись будет производиться в
конец файла) */
#define O_SYNC 020 /* Флаг синхронной записи */
/* Флаги, доступные только open(2) */
#define O_CREAT 00400 /* Создать и открыть файл, ис-
пользуя третий агрумент
open(2), как режим доступа
*/
#define O_TRUNC 01000 /* Открыть с опустошением */
#define O_EXCL 02000 /* Флаг исключительности */
/* Запросы к fcntl(2) */
#define F_DUPFD 0 /* Скопировать дескриптор файла */
#define F_GETFD 1 /* Получить флаги файла с данным
дескриптором */
#define F_SETFD 2 /* Установить флаги файла с данным
дескриптором */
#define F_GETFL 3 /* Получить флаги файла */
#define F_SETFL 4 /* Установить флаги файла */
#define F_GETLK 5 /* Получить состояние блокировки
файла */
#define F_SETLK 6 /* Установить блокировку файла */
#define F_SETLKW 7 /* Установить блокировку файла и
ждать */
#define F_CHKFL 8 /* Проверить допустимость измене-
ний флагов файла */
#define F_ALLOCSP 10 /* Зарезервирован */
#define F_FREESP 11 /* Зарезервирован */
/* Структура контроля за блокировкой сегмента файла,
информация передается пользователем системе */
struct flock {
short l_type;
short l_whence;
long l_start;
long l_len; /* Если 0, то до конца файла */
short l_sysid; /* Возвращается по запросу F_GETLK */
short l_pid; /* Возвращается по запросу F_GETLK */
};
/* Типы блокировок сегмента файла */
#define F_RDLCK 01 /* Блокировка на чтение */
#define F_WRLCK 02 /* Блокировка на запись */
#define F_UNLCK 03 /* Блокировка на удаление */
СМ. ТАКЖЕ
fcntl(2), open(2).
|