#включают
#включают
#включают
int open (const char *путь к файлу, ИНТ флаги);
int open (const char *путь к файлу, ИНТ флаги, mode_t Режим);
int creat (const char *путь к файлу, mode_t Режим);
Описание
открытый() Команда linux системного вызова используется для преобразования имени пути в дескриптор файла (небольшое неотрицательное целое число для использования в последующих операциях ввода-вывода, например читать, записывать, и т.д.). Когда вызов успешен, возвращаемый дескриптор файла будет самым нижним дескриптором файла, который в данный момент не открыт для процесса. Этот вызов создает новый открытый файл, не передаваемый другим процессам. (Но общие открытые файлы могут возникать через вилка(2) системный вызов.) Новый файловый дескриптор должен оставаться открытым для всех функций exec (см. Fcntl(2)). Смещение файла устанавливается на начало файла.
Параметр flags является одним из O_RDONLY, O_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
Файл открывается в режиме добавления. Перед каждым записывать, указатель файла располагается в конце файла, как будто с lseek. O_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_SYNC , O_DSYNC а также O_RSYNC. В настоящее время (2.1.130) все они являются синонимами под Linux.