открыть (системный вызов)
Для большинства файловых систем программа с инициализирует доступ к файлу в файловой системе помощью open системного вызова . При этом выделяются ресурсы, связанные с файлом ( дескриптор файла ), и возвращается дескриптор , который процесс будет использовать для ссылки на этот файл. В некоторых случаях открытие осуществляется путем первого доступа.
Один и тот же файл может быть открыт одновременно несколькими процессами и даже одним и тем же процессом, в результате чего для одного и того же файла создается несколько файловых дескрипторов; в зависимости от файловой организации и файловой системы. Операции с дескрипторами, такие как перемещение указателя файла или его закрытие, независимы — они не влияют на другие дескрипторы того же файла. Операции с файлом, такие как запись , могут быть просмотрены операциями с другими дескрипторами: при более позднем чтении можно прочитать вновь записанные данные.
Во время open
файловая система может выделить память для буферов или дождаться первой операции.
Абсолютный путь к файлу разрешен. Это может включать подключение к удаленному хосту и уведомление оператора о том, что требуется съемный носитель. Это может включать в себя инициализацию устройства связи. На этом этапе может быть возвращена ошибка, если хост или среда недоступны. первый доступ, по крайней мере, к каталогу Выполняется внутри файловой системы. Обычно возвращается ошибка, если компоненты более высокого уровня пути ( каталоги ) не могут быть найдены или доступны. Ошибка будет возвращена, если ожидается, что файл существует, а он не существует, или если файл уже не должен существовать, но он существует.
Если ожидается, что файл существует, и он существует, доступ к файлу, ограниченный флагами разрешений в метаданных файла или списке управления доступом , проверяется на соответствие запрошенному типу операций. Обычно для этого требуется дополнительный доступ к файловой системе, хотя в некоторых файловых системах метафлаги могут быть частью структуры каталогов.
Если файл создается, файловая система может выделить начальный объем памяти по умолчанию или указанный объем в зависимости от возможностей файловой системы. Если это не удастся, будет возвращена ошибка. Обновление каталога новой записью может быть выполнено или может быть отложено до закрытия завершения .
Различные другие ошибки, которые могут возникнуть во время открытия, включают сбои обновления каталога, неразрешенные множественные соединения, сбои носителя, сбои каналов связи и сбои устройств.
Возвращаемое значение всегда необходимо проверять и предпринимать действия, связанные с конкретной ошибкой.
Во многих случаях открытие библиотеки времени выполнения для конкретного языка программирования может выполнять дополнительные действия, включая инициализацию структуры библиотеки времени выполнения, связанной с файлом.
Как только файл больше не нужен, программа должна его закрыть. Это приведет к обновлению буферов библиотеки времени выполнения и файловой системы на физическом носителе и позволит другим процессам получить доступ к данным, если требовалось эксклюзивное использование. Некоторые библиотеки времени выполнения могут закрыть файл, если программа вызывает выход во время выполнения. Некоторые файловые системы могут выполнять необходимые операции после завершения работы программы. Ни одно из этих событий вряд ли произойдет в случае сбоя ядра или питания. Это может привести к повреждению структур файловой системы, требующему запуска привилегированных и длительных утилит файловой системы, во время которых вся файловая система может быть недоступна.
аргументы открытого вызова
[ редактировать ]- Путь к файлу,
- Тип доступа, запрошенного к файлу (чтение, запись, добавление и т. д.),
- Первоначальное разрешение файла запрашивается с использованием третьего аргумента, называемого
mode
. Этот аргумент имеет значение только при создании нового файла.
После использования файла процесс должен закрыть файл с помощью вызова close , который принимает файловый дескриптор закрываемого файла. Некоторые файловые системы имеют возможность разрешить выпуск файла.
Некоторые компьютерные языки включают библиотеки времени выполнения, которые включают дополнительные функции для определенных файловых систем. Открытие (или какая-либо вспомогательная процедура) может включать в себя спецификации размера ключа, размера записи, скорости соединения. Некоторые открытые процедуры включают спецификацию программного кода, который будет выполняться в случае ошибки.
Форма языка Perl
[ редактировать ]open FILEHANDLE,MODE[,EXPR]
например:
open(my $fh, ">", "output.txt");
Perl также использует tie
функция Tie::File
модуль для связывания массива с
файл. [1] tie::AnyDBM_File
функция связывает хэш с файлом. [2]
Определение библиотеки C POSIX
[ редактировать ]вызов Открытый стандартизирован спецификацией POSIX для языка C :
int open(const char *path, int oflag, .../*,mode_t mode */);
int openat(int fd, const char *path, int oflag, ...);
int creat(const char *path, mode_t mode);
FILE *fopen(const char *restrict filename, const char *restrict mode);
Возвращаемое значение представляет собой дескриптор файла, который является ссылкой на структуру, специфичную для процесса, которая, среди прочего, содержит указатель позиции, указывающий, какое место в файле будет обработано следующей операцией.
Open может вернуть −1, указывая на сбой с errno
подробное описание ошибки.
Файловая система также обновляет глобальную таблицу всех открытых файлов, которая используется для определения того, используется ли файл в данный момент каким-либо процессом.
путь
[ редактировать ]Имя файла, который нужно открыть. Он включает путь к файлу, определяющий, где и в какой файловой системе файл находится (или должен быть создан).
openat
ожидает относительный путь.
заказ
[ редактировать ]Этот аргумент формируется путем объединения необязательных параметров по операции ИЛИ и (из < fcntl.h >) одного из:
O_RDONLY
, O_RDWR
и O_WRONLY
Параметры опции включают в себя:
O_APPEND
записанные данные будут добавлены в конец файла. Файловые операции всегда перемещают указатель позиции в конец файла.O_CREAT
Создайте файл, если он не существует; в противном случае при открытии не удастся установить errno в ENOENT.O_EXCL
Используется сO_CREAT
если файл уже существует, выполнить ошибку, установив для errno значение EEXIST.O_TRUNC
Если файл уже существует, отбросьте его предыдущее содержимое, превратив его в пустой файл. Неприменимо для устройства или именованного канала.
Дополнительные флаги и ошибки определяются при открытом вызове.
creat()
реализуется как:
int creat(const char *path, mode_t mode)
{
return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode);
}
fopen использует строковые флаги, такие как r
, w
, a
и +
и возвращает указатель файла, используемый с fgets , fputs и fclose .
режим
[ редактировать ]Необязательно и актуально только при создании нового файла. Определяет права доступа к файлам . К ним относятся чтение, запись или выполнение файла владельцем, группой или всеми пользователями. Режим маскируется umask вызывающего процесса : биты, установленные в umask, очищаются в режиме.
См. также
[ редактировать ]- Дескриптор файла – как он работает и другие функции, связанные с
open
Примечания
[ редактировать ]- ^ "Связь::Файл" . perldoc.perl.org . Проверено 7 августа 2011 г.
- ^ «ЛюбойDBM_файл» . perldoc.perl.org . Проверено 7 августа 2011 г.
Ссылки
[ редактировать ]- Продвинутое программирование в среде UNIX, У. Ричард Стивенс ISBN 81-7808-096-6
- Концепция и применение UNIX, Сумитабх Дас