OPEN(2) OPEN(2) НАЗВАНИЕ open - открыть файл для чтения или записи СИНТАКСИС |#include | |int open (path, oflag [, mode]) |char *path; |int oflag, mode; ОПИСАНИЕ Аргумент path является указателем на маршрутное имя файла. Системный вызов open открывает дескриптор для указанного файла и устанавливает флаги статуса файла в соответствии со значением аргумента oflag. Для файлов, не являющихся ПОТОКОВЫМИ [см. intro(2)], значение oflag задается как поразрядное ИЛИ флагов из следующего спис- ка (из первых трех флагов можно установить только один): O_RDONLY Открыть только на чтение. O_WRONLY Открыть только на запись. O_RDWR Открыть на чтение/запись. O_NDELAY Этот флаг может воздействовать на последующие опе- рации чтения и записи [см. read(2) и write(2)]. При открытии именованного канала с установленными флагами O_RDONLY или O_WRONLY: 1. Если установлен флаг O_NDELAY, то вызов open только на чтение завершается без задержки, а вызов open только для записи отрабатывает с со- общением об ошибке, если в данный момент нет процесса, открывшего файл для чтения; 2. Если не установлен флаг O_NDELAY, то вызов open только на чтение блокируется, пока какой-либо процесс не откроет файл для записи, а вызов open только на запись блокируется, пока какой- либо процесс не откроет файл на чтение. При открытии файла, ассоциированного с линией свя- зи: 1. Если установлен флаг O_NDELAY, то вызов open завершается без ожидания несущей. 2. Если не установлен флаг O_NDELAY, то вызов open блокируется до появления несущей. O_APPEND Перед каждой операцией записи устанавливать указа- тель текущей позиции на конец файла. O_SYNC При открытии обычного файла этот флаг воздействует на последующие операции записи. Если флаг установ- лен, то каждый вызов write(2) ожидает физического обновления как данных, так и статуса файла. O_CREAT Если файл существует, то флаг игнорируется. В про- тивном случае идентификаторы владельца и группы создаваемого файла устанавливаются равными, соот- ветственно, действующим идентификаторам пользова- теля и группы процесса, а младшие 12 бит значения режима доступа к файлу устанавливаются равными значению аргумента mode, модифицированному следую- щим образом [см. creat(2)]: 1. Биты, соответствующие единичным битам маски ре- жима создания файлов текущего процесса [см. umask(2)], устанавливаются равными 0. 2. Бит навязчивости [см. chmod(2)] устанавливается равным 0. O_TRUNC Если файл существует, то он опустошается (размер становится равным 0), а режим доступа и владелец не изменяются. O_EXCL Если установлены оба флага O_EXCL и O_CREAT, то системный вызов open завершается неудачей, если файл уже существует. При открытии ПОТОКОВЫХ файлов значение oflag может за даваться как поразрядное ИЛИ флага O_NDELAY с одним из флагов O_RDONLY, O_WRONLY или O_RDWR. Другие флаги при- менительно к ПОТОКОВЫМ файлам игнорируются. Флаг O_NDE- LAY воздействует на работу ПОТОКОВЫХ драйверов и неко торые системные вызовы [см. getmsg(2), putmsg(2), re- ad(2), write(2)]. Что касается драйверов, то реализация флага O_NDELAY зависит от устройства. Некоторые флаги могут быть установлены и после открытия файла, посредством системного вызова fcntl(2) [см. так- же fcntl(5)]. Указатель текущей позиции устанавливается на начало файла. Новый дескриптор файла остается открытым после выполне- ния системных вызовов exec(2) [см. fcntl(2)]. Системный вызов open завершается неудачей и дескриптор указанного файла не открывается, если выполнено хотя бы одно из следующих условий: [EACCES] Нет права на поиск для компонента маршрута. [EACCES] Для указанного файла нет прав на выполнение операций, задаваемых значением oflag. [EAGAIN] Файл существует и доступ к нему заблокир ван [см. chmod(2)]. [EEXIST] Флаги O_CREAT и O_EXCL установлены и ука- занный файл существует. [EFAULT] Аргумент path указывает за пределы отведен ного процессу адресного пространства. [EINTR] Во время выполнения системного вызова пе- рехвачен сигнал. [EIO] Разрыв связи или ошибка при открытии псев доустройства. [EISDIR] Указанный файл является каталогом и откры- вается на запись или чтение/запись. [EMFILE] Превышается максимально допустимое коли- чество дескрипторов файлов, открытых одно- временно в одном процессе. [EMULTIHOP] Компоненты path требуют многократного обра- щения к удаленным компьютерам. [ENFILE] Переполнение системной таблицы файлов. [ENOENT] Флаг O_CREAT не установлен и указанный файл не существует. [ENOLINK] Маршрутное имя path указывает на удаленный компьютер, связи с которым в данный момент нет. [ENOMEM] Система не в состоянии выделить память под дескриптор пересылки. [ENOSPC] Установлены флаги O_CREAT и O_EXCL и нет свободных описателей файлов. [ENOSR] Нет места для потока. [ENOTDIR] Компонент маршрута не является каталогом. [ENXIO] Указанный файл является специальным сим- вольным или блочным файлом, а устройство, ассоциированное с этим специальным файлом, не существует. [ENXIO] Установлены флаги O_NDELAY и O_WRONLY, ука- занный файл является именованным каналом и нет процесса, открывшего файл для чтения. [ENXIO] Неудачная попытка выполнить процедуру отк- рытия для ПОТОКОВОГО модуля или драйвера. [EROFS] Указанный файл расположен в файловой систе- ме, доступной только на чтение, а открыва- ется на запись или чтение/запись. [ETXTBSY] Файл содержит секцию команд, которая в дан- ный момент выполняется. СМ. ТАКЖЕ chmod(2), close(2), creat(2), dup(2), fcntl(2), intro(2), lseek(2), read(2), getmsg(2), putmsg(2), umask(2), write(2), fcntl(5). ДИАГНОСТИКА При успешном завершении результатом служит дескриптор файла; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки.