конспект
#включают
Описание
открыть() system linux используется для преобразования имени пути в файловый дескриптор (небольшое целое неотрицательное значение для использования в последующих вводах-выводах, как с читать, записывать, так далее.). Когда вызов будет успешным, дескриптор файла вернется как самый младший дескриптор файла, который в настоящий момент не открыт для процесса. Этот вызов создает новый открытый файл, не используемый другим процессом. (Но общие открытые файлы могут возникать черезвилка(2) системный вызов.) Новый файловый дескриптор установлен как открытый для всех функций exec (см.Fcntl(2)). Смещение файла устанавливается в начало файла.
Параметр флаги один изO_RDONLY, O_WRONLY или жеO_RDWR которые запрашивают открытие файла только для чтения, только для записи или чтения / записи, соответственно, или же 'd с нулем или более из следующего:
O_CREAT
Если файл не существует, он будет создан. У владельца (идентификатора пользователя) файла установлен эффективный идентификатор пользователя процесса. Групповое владение (идентификатор группы) устанавливается либо на эффективный идентификатор группы процесса, либо на идентификатор группы родительского каталога (в зависимости от типа файловой системы и параметров монтирования и режима родительского каталога, см., Например, mount опции 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
Файл открыт для синхронного ввода-вывода. любойзаписыватьs в результирующем файловом дескрипторе блокирует вызывающий процесс, пока данные не будут физически записаны в базовое оборудование. См. ОГРАНИЧЕНИЯ ниже.
O_NOFOLLOW
Если путь к файлу является символическим звеном, тогда сбой не работает. Это расширение FreeBSD, которое было добавлено в Linux в версии 2.1.126. Символические ссылки в более ранних компонентах пути будут по-прежнему соблюдаться. Заголовки от glibc 2.0.100 и более поздних версий включают определение этого флага; ядра до 2.1.126 будут игнорироваться, если они используются .
O_DIRECTORY
Если путь к файлу не является каталогом, из-за чего open не работает. Этот флаг является специфичным для 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 путь к файлу относится к каталогу, и запрашиваемый доступ включает в себя запись (то есть,O_WRONLY или жеO_RDWR установлен). EACCES Запрошенный доступ к файлу не разрешен или один из каталогов в путь к файлу не разрешало разрешение на поиск (выполнение) или файл еще не существовал, а доступ на запись к родительскому каталогу не разрешен. ENAMETOOLONG путь к файлу было слишком долго. ENOENT O_CREAT не установлен, и именованный файл не существует. Или компонент каталога в путь к файлу не существует или является висячей символической ссылкой. ENOTDIR Компонент, используемый как каталог в путь к файлу на самом деле не является каталогом илиO_DIRECTORYбыл указан и путь к файлу не был каталогом. ENXIO O_NONBLOCK | O_WRONLY установлен, именованный файл является FIFO, и ни один процесс не имеет открытого файла для чтения. Или файл является специальным файлом устройства, и соответствующее устройство не существует. ENODEV путь к файлу относится к специальному файлу устройства, и соответствующее устройство не существует. (Это ошибка ядра Linux - в этой ситуации необходимо вернуть ENXIO.) EROFS путь к файлу относится к файлу в файловой системе только для чтения, и запрос на запись был запрошен. ETXTBSY путь к файлу относится к исполняемому изображению, которое в настоящее время выполняется, и был запрошен доступ на запись. 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. ошибки
В соответствии с
ограничения




