[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Открытие файла

Системный вызов open(2) устанавливает путь для данных от прикладной
программы к файлу или устройству. Аргументы этого вызова:
   path   указывает на  строку символов,  содержащую путевое имя файла
          или  устройства.   Имя  может  быть  либо  абсолютным,  либо
          относительным.

          В ОС  UNIX System  5 Версия  3  (SVR3)  была  добавлена  RFS
          (Remote File  Sharing). Имя  файла  может  быть  RFS-именем,
          например, указывать на файл на другом компьютере.

   oflag  указывает, в  каком режиме  следует открыть  файл. Например,
          следует ли  файл открыть  для чтения и/или записи, создать и
          т.д. Значение  этого флага  получается с  помощью побитового
          ИЛИ символьных констант, определенных в <fcntl.h>.

   mode   используется для  установки битов  прав  доступа  для  вновь
          открытого файле.  Внимание: ненулевое  значение umask  может
          отменить права доступа, указанные в mode.

Значение, возвращаемое open(2), является наименьшим доступным файловым
дескриптором - от нуля до предела, установленного при конфигурации.
Этот дескриптор используется системными вызовами read(2) и write(2).
Обычно, файловые дескрипторы 0, 1 и 2 уже определены при старте
программы. Файловый дескриптор имеет смысл либо до закрытия файла
вызовом close(2), либо до завершения программы. Файл должен быть
открыт до того, как будет осуществляться чтение или записи.
В SVR4 конфигурационные параметры SFNOLIM и HFNOLIM управляют
максимальным числом файлов, которые могут быть открытыми процессом.
SFNOLIM - т.н. мягкий предел, HFNOLIM  - жесткий. Значение по
умолчанию для обоих 256. Мягкий предел можно изменить вызовом
setrlimit(2) в любое значение между 0 и величиной жесткого предела.
Только суперпользователь может увеличить значение жесткого предела.
                            ОТКРЫТИЕ ФАЙЛА
open(2)

ИМЯ

      open - открыть файл для чтения/записи

ИСПОЛЬЗОВАНИЕ

      #include <sys/types.h>
      #include <fcntl.h>
      #include <sys/stat.h>

      int open (const char *path, int oflag,
           ... /* mode_t mode */);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

      успех - неотрицательный дескриптор файла

      неуспех - -1 и errno установлена
                           open(2) - Флаги

Следующие флаги,  определенные в  <fcntl.h>, могут  быть объединены  с
помощью побитового  ИЛИ и  использованы совместно  в  аргументе  oflag
вызова open(2).  Замечание: должен  быть использован  хотя бы  один из
первых трех флагов, иначе вызов open(2) окончится неуспехом.

O_RDONLY       Открывает файл для чтения.
O_WRONLY       Открывает файл для записи.
O_RDWR         Открывает файл для чтения и для записи.
O_APPEND       Перед каждой  записью помещает  указатель файла в конец
               файла.  Иными   словами,  все   операции  записи  будут
               происходить в конец файла.
O_CREAT        Создает файл, если он не существует.
O_TRUNC        Стирает данные  файла, устанавливая размер файла равным
               нулю.
O_EXCL         Используется  совместно  с  O_CREAT.  Вызывает  неуспех
               open(2), если файл уже существует.
O_SYNC         Заставляет write(2) ожидать окончания физической записи
               на диск.
O_NDELAY,O_NONBLOCK Открытие  специального байт-ориентированного файла
               или именованного    программного      канала      часто
               вызывает       блокировку.   Любой   из   этих   флагов
               предотвращает блокировку  open(2). Если установлены оба
               флага, O_NONBLOCK получает приоритет.
O_NOCTTY       Не открывает файл терминала как управляющий терминал.

Аргумент mode должен быть использован совместно с O_CREAT флагом при
создании нового файла. Права доступа у вновь открытого файла будут
установлены в непредсказуемое значение, если mode будет опущен. Биты
прав доступа устанавливаются в значение mode & ~umask, где umask -
значение полученное после выполнения команды umask(1).
Флаги O_NDELAY и O_NONBLOCK воздействуют на именованные программные
каналы и специальные байт-ориентированные файлы. При установке любого
из этих флагов возникает состояние "не ждать". Для коммуникационного
вызова возврат из open(2) будет происходить без ожидания несущей. Если
именованный программный канал открыт для чтения и нет программы,
которая в него пишет, open(2) немедленно возвратится. Если же
программный канал открыт для записи, и нет программы, которая читает,
open(2) окончится неуспехом. Использование флага O_NDELAY при открытии
терминального файла и различие между O_NDELAY и O_NONBLOCK обсуждаются
ниже в этом разделе.
Только управляющий сессией может открыть управляющий терминал. Первый
же терминал, открываемый им и не ассоциированный с сессией, становится
управляющим терминалом. Терминал может быть управляющим только для
одной сессии. При входе в систему открываемый вами терминал становится
управляющим терминалом для вашего shell-процесса. Управляющие
терминалы имеют дело с сигналами завершения и прерывания и с
управлением заданиями. Это обсуждается в курсе Внутренние системные
вызовы ОС UNIX и библиотечные функции - Часть 2. Флаг O_NOCTTY
позволяет управляющему сессией открыть терминал, который не становится
управляющим. Например, демон, такой как hdelogger (регистратор ошибок
жесткого диска), являясь управляющим сессией, открывает консоль с
флагом O_NOCTTY для выдачи сообщений об ошибке. Если бы hdelogger
открыл консоль как управляющий терминал, то это воспрепятствовало бы
входу в систему на этой консоли.
Системный вызов creat(2) эквивалентен вызову open(path, O_CREAT |
O_TRUNC | O_WRONLY, mode).
                            ФЛАГИ open(2)

O_RDONLY            только на чтение

O_WRONLY            только на запись

O_RDWR              на чтение и запись

O_APPEND            все записи в конец файла

O_TRUNC             стереть все данные

O_CREAT             создать новый файл

O_EXCL              вместе с O_CREAT:
                    успех только при создании

O_SYNC              ожидать физической записи

O_NDELAY
O_NONBLOCK          без блокировки

O_NOCTTY            не управляющий терминал