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 в случае, если сегмент файла уже блокирован другим процессом, для достижения мобильности прикладных программ следует ожидать и обра- батывать оба кода ошибки.