Skip to main content

Командная команда Open Linux и команда Unix

Генерация словарей средствами командной строки Linux (Июнь 2026)

Генерация словарей средствами командной строки Linux (Июнь 2026)
Anonim

конспект

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

Описание

открыть() 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.