mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

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).



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк