[<<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 не управляющий терминал