FCNTL(2)                                               FCNTL(2)
НАЗВАНИЕ
fcntl - управление файлами
СИНТАКСИС
       |#include <fcntl.h>
       |
       |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 в  случае,  если  сегмент
        файла  уже  блокирован другим процессом, для достижения
        мобильности прикладных программ следует ожидать и обра-
        батывать оба кода ошибки.