Open Linux Command и Unix Command

#включают 
#включают
#включают
int open (const char *путь к файлу, ИНТ флаги);
int open (const char *путь к файлу, ИНТ флаги, mode_t Режим);
int creat (const char *путь к файлу, mode_t Режим);

Описание

 открытый() Команда linux системного вызова используется для преобразования имени пути в дескриптор файла (небольшое неотрицательное целое число для использования в последующих операциях ввода-вывода, например читатьзаписывать, и т.д.). Когда вызов успешен, возвращаемый дескриптор файла будет самым нижним дескриптором файла, который в данный момент не открыт для процесса. Этот вызов создает новый открытый файл, не передаваемый другим процессам. (Но общие открытые файлы могут возникать через вилка(2) системный вызов.) Новый файловый дескриптор должен оставаться открытым для всех функций exec (см. Fcntl(2)). Смещение файла устанавливается на начало файла.

Параметр flags является одним из O_RDONLYO_WRONLY или же O_RDWR какой запрос открывает файл только для чтения, только для записи или для чтения / записи, соответственно, поразрядно или с нулем или более из следующего:

O_CREAT

Если файл не существует, он будет создан. Владелец (идентификатор пользователя) файла устанавливается на эффективный идентификатор пользователя процесса. Владение группой (идентификатор группы) устанавливается либо на эффективный идентификатор группы процесса, либо на идентификатор группы родительского каталога (в зависимости от типа файловой системы и параметров монтирования, а также от режима родительского каталога, см., Например, монтирование параметры bsdgroups и sysvgroups файловой системы ext2, как описано в крепление(8)).

O_EXCL

При использовании с O_CREAT, если файл уже существует, это ошибка и открытый не удастся. В этом контексте символическая ссылка существует независимо от того, куда она указывает. O_EXCL не работает в файловых системах NFS, программы, которые используют его для выполнения задач блокировки, будут содержать условие состязания. Решение для выполнения атомарной блокировки файлов с использованием файла блокировки состоит в том, чтобы создать уникальный файл на том же fs (например, включающий имя хоста и pid), использовать ссылку (2), чтобы сделать ссылку на файл блокировки. Если ссылка() возвращает 0, блокировка успешна. В противном случае используйте стат(2) в уникальном файле, чтобы проверить, увеличилось ли количество ссылок до 2, и в этом случае блокировка также будет успешной.

O_NOCTTY

Если путь относится к терминальному устройству — см. TTY(4) — он не станет управляющим терминалом процесса, даже если у процесса его нет.

O_TRUNC

Если файл уже существует и является обычным файлом, а открытый режим позволяет записывать (то есть O_RDWR или O_WRONLY), он будет усечен до длины 0. Если файл является файлом FIFO или терминального устройства, флаг O_TRUNC игнорируется. В противном случае эффект O_TRUNC не определен. (Во многих версиях Linux это будет игнорироваться; в других версиях он вернет ошибку.)

O_APPEND

Файл открывается в режиме добавления. Перед каждым записывать, указатель файла располагается в конце файла, как будто с lseekO_APPEND может привести к повреждению файлов в файловых системах NFS, если более одного процесса добавляет данные в файл одновременно. Это связано с тем, что NFS не поддерживает добавление к файлу, поэтому ядро ​​клиента должно имитировать его, что невозможно сделать без условия гонки.

O_NONBLOCK или же O_NDELAY

По возможности файл открывается в неблокирующем режиме. Ни открытый и любые последующие операции с возвращаемым дескриптором файла не заставят вызывающий процесс ждать. Для обработки FIFO (именованных каналов), см. Также ФИФО(4). Этот режим не должен оказывать никакого влияния на файлы, кроме FIFO.

O_SYNC

Файл открывается для синхронного ввода-вывода. Любые пишет в результате дескриптор файла будет блокировать вызывающий процесс до тех пор, пока данные не будут физически записаны на базовое оборудование. См. ОГРАНИЧЕНИЯ ниже, хотя.

O_NOFOLLOW

Если pathname является символической ссылкой, то открытие завершается неудачно. Это расширение FreeBSD, которое было добавлено в Linux в версии 2.1.126. Символьные ссылки в более ранних компонентах пути еще будут использоваться. Заголовки из glibc 2.0.100 и более поздних версий включают определение этого флага; ядра до 2.1.126 будут игнорировать его, если он используется.

O_DIRECTORY

Если путь не является каталогом, вызывать сбой открытия. Этот флаг специфичен для Linux и был добавлен в ядро ​​версии 2.1.126, чтобы избежать проблем отказа в обслуживании, если opendir(3) вызывается на FIFO или ленточном устройстве, но не должен использоваться за пределами реализации opendir.

O_DIRECT

Постарайтесь минимизировать эффекты кэширования ввода-вывода в этот файл и из него. В целом, это снижает производительность, но полезно в особых ситуациях, например, когда приложения выполняют свое собственное кэширование. Файловый ввод / вывод осуществляется непосредственно в / из буферов пространства пользователя. Ввод / вывод происходит синхронно, т.е. при завершении читать(2) или записывать(2) системный вызов, данные гарантированно были переданы. Размеры передачи и выравнивание пользовательского буфера и смещения файла должны быть кратны размеру логического блока файловой системы.

Этот флаг поддерживается во многих Unix-подобных системах; поддержка была добавлена ​​в Linux в версии ядра 2.4.10.

Семантически подобный интерфейс для блочных устройств описан в сырье(8).

O_ASYNC

Генерация сигнала (по умолчанию SIGIO, но это можно изменить с помощью Fcntl(2)) когда ввод или вывод становятся возможными для этого файлового дескриптора. Эта функция доступна только для терминалов, псевдо-терминалов и розеток. Видеть Fcntl(2) для получения дополнительной информации.

O_LARGEFILE

В 32-разрядных системах, которые поддерживают систему больших файлов, разрешается открывать файлы, размеры которых не могут быть представлены в 31 бите.

Некоторые из этих необязательных флагов могут быть изменены с помощью Fcntl после того, как файл был открыт.

Режим аргумента определяет разрешения для использования в случае создания нового файла. Это модифицируется процессом Umask обычным способом: разрешения созданного файла (Режим ~ Umask). Обратите внимание, что этот режим применяется только к будущему доступу к вновь созданному файлу; открытый Вызов, создающий файл только для чтения, вполне может вернуть дескриптор файла для чтения / записи.

Для режима предусмотрены следующие символические константы:

S_IRWXU

Пользователь 00700 (владелец файла) имеет права на чтение, запись и выполнение

S_IRUSR (S_IREAD)

00400 пользователь имеет разрешение на чтение

S_IWUSR (S_IWRITE)

00200 пользователь имеет разрешение на запись

S_IXUSR (S_IEXEC)

00100 пользователь имеет разрешение на выполнение

S_IRWXG

00070 группа имеет права на чтение, запись и выполнение

S_IRGRP

00040 группа имеет разрешение на чтение

S_IWGRP

00020 группа имеет разрешение на запись

S_IXGRP

00010 группа имеет разрешение на выполнение

S_IRWXO

00007 другие имеют права на чтение, запись и выполнение

S_IROTH

00004 другие имеют разрешение на чтение

S_IWOTH

00002 другие имеют разрешение на запись

S_IXOTH

00001 другие имеют разрешение на исполнение

режим должен быть указан, когда O_CREAT в флагах, и игнорируется в противном случае.

Creat эквивалентно открытый с флагами, равными O_CREAT | O_WRONLY | O_TRUNC.

Возвращаемое значение

открытый а также Creat вернуть дескриптор нового файла или -1, если произошла ошибка (в этом случае errno устанавливается соответствующим образом). Обратите внимание, что открытый Можно открыть специальные файлы устройства, но Creat не может их создать — используйте MKNOD(2) вместо.

В файловых системах NFS с включенным отображением UID открытый может вернуть дескриптор файла, но, например, читать(2) запросы отклонены с EACCES. Это потому, что клиент выполняет открытый путем проверки разрешений, но сопоставление UID выполняется сервером при запросах на чтение и запись.

Если файл только что создан, его поля atime, ctime, mtime устанавливаются на текущее время, а также поля ctime и mtime родительского каталога. В противном случае, если файл изменяется из-за флага O_TRUNC, его поля ctime и mtime устанавливаются на текущее время.

ошибки

EEXIST

путь уже существует и O_CREAT а также O_EXCL были использованы.

EISDIR

pathname ссылается на каталог и запрашиваемый доступ, включающий запись (то естьO_WRONLY или же O_RDWR установлено).

EACCES

Запрашиваемый доступ к файлу не разрешен, или один из каталогов в pathname не разрешил поиск (выполнение), либо файл еще не существует, и доступ на запись в родительский каталог не разрешен.

ENAMETOOLONG

путь был слишком длинным.

ENOENT

O_CREAT не установлен и указанный файл не существует. Или имя каталога компонента inpathname не существует или является висячей символической ссылкой.

ENOTDIR

Компонент, используемый в качестве каталога в pathname, фактически не является каталогом или O_DIRECTORY был указан, а путь не был каталогом.

ENXIO

O_NONBLOCK | O_WRONLY установлен, указанный файл является FIFO, и ни у одного процесса нет файла, открытого для чтения. Или файл является специальным файлом устройства, и соответствующее устройство не существует.

ENODEV

pathname ссылается на специальный файл устройства, и соответствующее устройство не существует. (Это ошибка ядра Linux, в этом случае необходимо вернуть ENXIO.)

EROFS

pathname ссылается на файл в файловой системе, доступной только для чтения, и запрашивается доступ для записи.

ETXTBSY

pathname относится к исполняемому образу, который в данный момент выполняется, и был запрошен доступ для записи.

EFAULT

путь указывает за пределы вашего доступного адресного пространства.

ELOOP

Слишком много символических ссылок было найдено при разрешении пути или O_NOFOLLOW был указан, но путь был символической ссылкой.

ENOSPC

путь должен был быть создан, но на устройстве, содержащем путь, нет места для нового файла.

ENOMEM

Недостаточно памяти ядра.

EMFILE

У процесса уже есть максимальное количество открытых файлов.

ENFILE

Достигнуто ограничение на общее количество файлов, открытых в системе.

В соответствии с

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW а также O_DIRECTORY флаги специфичны для Linux. Возможно, придется определить _GNU_SOURCE макрос, чтобы получить их определения.

ограничения

В протоколе, лежащем в основе NFS, есть много ошибок, влияющих среди прочего O_SYNC а также O_NDELAY.

POSIX предоставляет три различных варианта синхронизированного ввода-вывода, соответствующих флагам O_SYNCO_DSYNC а также O_RSYNC. В настоящее время (2.1.130) все они являются синонимами под Linux.

Ссылка на основную публикацию