Green-sell.info

Новые технологии
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Open c linux

Open c linux

Некоторые из вышеописанных флагов могут быть изменены с помощью fctnl после открытия файла. Аргумент mode задает права доступа, которые используются в случае создания нового файла. Они модифицируются обычным способом, с помощью umask процесса; права доступа созданного файла равны (mode &

umask). Обратите внимание, что этот режим применяется только к правам создаваемого файла; open создает файл только для чтения, но может вернуть дескриптор с установленными флагами для чтения и записи.

Следующие символьные константы можно использовать в mode: 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 все остальные имеют права на выполнение
файла).

mode всегда должен быть указан при использовании O_CREAT; во всех остальных случаях этот параметр игнорируется. creat эквивалентен open с flags, которые равны O_CREAT | O_WRONLY | O_TRUNC.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

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

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

НАЙДЕННЫЕ ОШИБКИ


СООТВЕТСТВИЕ СТАНДАРТАМ

Эффект (неопределенный изначально) от O_RDONLY | O_TRUNC отличается в разных реализациях. Во многих системах файл в действительности обрезается.

Флаг O_DIRECT был представлен в SGI IRIX, где он имеет похожие ограничения по принаджености, как и в Linux. IRIX также имеет вызов fcntl(2) для очередей с выравниванием и размерами. FreeBSD 4.x имеет флаг с таким же именем, но без ограничений на выравнивание. В Linux была добавлена поддержка с ядра версии 2.4.10. Старые ядра Linux просто игнорируют этот флаг.

Open c linux

НАЗВАНИЕ
open — открыть файл для чтения или записи

ОПИСАНИЕ
Аргумент path является указателем на маршрутное имя файла. Системный вызов open открывает дескриптор для указанного файла и устанавливает флаги статуса файла в соответствии со значением аргумента oflag. Для файлов, не являющихся псевдоустройствами [см. intro(2)], значение oflag задается как поразрядное ИЛИ флагов из следующего списка (из первых трех флагов можно установить только один): O_RDONLY Открыть только на чтение. O_WRONLY Открыть только на запись. O_RDWR Открыть на чтение/запись. O_NDELAY Этот флаг может воздействовать на последующие операции чтения и записи [см. read(2) и write(2)].

При открытии именованного канала с установленными флагами O_RDONLY или O_WRONLY:

  1. Если установлен флаг O_NDELAY, то вызов open только на чтение завершается без задержки, а вызов open только для записи отрабатывает с сообщением об ошибке, если в данный момент нет процесса, открывшего файл для чтения;
  2. Если не установлен флаг O_NDELAY, то вызов open только на чтение блокируется, пока какой-либо процесс не откроет файл для записи, а вызов open только на запись блокируется, пока какой либо процесс не откроет файл на чтение.

При открытии файла, ассоциированного с линией связи:

  1. Если установлен флаг O_NDELAY, то вызов open завершается без ожидания несущей.
  2. Если не установлен флаг O_NDELAY, то вызов open блокируется до появления несущей.

O_APPEND Перед каждой операцией записи устанавливать указатель текущей позиции на конец файла. O_SYNC При открытии обычного файла этот флаг воздействует на последующие операции записи. Если флаг установлен, то каждый вызов write(2) ожидает физического обновления как данных, так и статуса файла. O_CREAT Если файл существует, то флаг игнорируется. В противном случае идентификаторы владельца и группы создаваемого файла устанавливаются равными, соответственно, действующим идентификаторам пользователя и группы процесса, а младшие 12 бит значения режима доступа к файлу устанавливаются равными значению аргумента mode, модифицированному следующим образом [см. creat(2)]:

  1. Биты, соответствующие единичным битам маски режима создания файлов текущего процесса [см. umask(2)], устанавливаются равными 0.
  2. Бит навязчивости [см. chmod(2)] устанавливается равным 0.

O_TRUNC Если файл существует, то он опустошается (размер становится равным 0), а режим доступа и владелец не изменяются. O_EXCL Если установлены оба флага O_EXCL и O_CREAT, то системный вызов open завершается неудачей, если файл уже существует.

При открытии псевдоустройства значение oflag может задаваться как поразрядное ИЛИ флага O_NDELAY с одним из флагов O_RDONLY, O_WRONLY или O_RDWR. Другие флаги применительно к псевдоустройствам игнорируются. Флаг O_NDELAY воздействует на работу драйверов псевдоустройств и некоторые системные вызовы [см. getmsg(2), putmsg(2), read(2), write(2)]. Что касается драйверов, то реализация флага O_NDELAY зависит от устройства.

Некоторые флаги могут быть установлены и после открытия файла, посредством системного вызова fcntl(2) [см. также fcntl(5)].

Указатель текущей позиции устанавливается на начало файла.

Новый дескриптор файла остается открытым после выполнения системных вызовов exec(2) [см. fcntl(2)].

Системный вызов open завершается неудачей и дескриптор указанного файла не открывается, если выполнено хотя бы одно из следующих условий: [EACCES] Нет права на поиск для компонента маршрута. [EACCES] Для указанного файла нет прав на выполнение операций, задаваемых значением oflag. [EAGAIN] Файл существует и доступ к нему заблокирован [см. chmod(2)]. [EEXIST] Флаги O_CREAT и O_EXCL установлены и указанный файл существует. [EFAULT] Аргумент path указывает за пределы отведенного процессу адресного пространства. [EINTR] Во время выполнения системного вызова перехвачен сигнал. [EIO] Разрыв связи или ошибка при открытии псевдоустройства. [EISDIR] Указанный файл является каталогом и открывается на запись или чтение/запись. [EMFILE] Превышается максимально допустимое количество дескрипторов файлов, открытых одновременно в одном процессе. [EMULTIHOP] Компоненты path требуют многократного обращения к удаленным компьютерам. [ENFILE] Переполнение системной таблицы файлов. [ENOENT] Флаг O_CREAT не установлен и указанный файл не существует. [ENOLINK] Маршрутное имя path указывает на удаленный компьютер, связи с которым в данный момент нет. [ENOMEM] Система не в состоянии выделить память под дескриптор пересылки. [ENOSPC] Установлены флаги O_CREAT и O_EXCL и нет свободных описателей файлов. [ENOSR] Нет места для потока. [ENOTDIR] Компонент маршрута не является каталогом. [ENXIO] Указанный файл является специальным символьным или блочным файлом, а устройство, ассоциированное с этим специальным файлом, не существует. [ENXIO] Установлены флаги O_NDELAY и O_WRONLY, указанный файл является именованным каналом и нет процесса, открывшего файл для чтения. [ENXIO] Неудачная попытка выполнить процедуру открытия для модуля или драйвера псевдоустройства. [EROFS] Указанный файл расположен в файловой системе, доступной только на чтение, а открывается на запись или чтение/запись. [ETXTBSY] Файл содержит секцию команд, которая в данный момент выполняется.

Читать еще:  Visual studio code linux c

ДИАГНОСТИКА
При успешном завершении результатом служит дескриптор файла; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки

Open c linux

This section describes the primitives for opening and closing files using file descriptors. The open and creat functions are declared in the header file fcntl.h , while close is declared in unistd.h .

Function: int open (const char * filename , int flags [, mode_t mode ])

Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | See POSIX Safety Concepts.

The open function creates and returns a new file descriptor for the file named by filename . Initially, the file position indicator for the file is at the beginning of the file. The argument mode (see Permission Bits) is used only when a file is created, but it doesn’t hurt to supply the argument in any case.

The flags argument controls how the file is to be opened. This is a bit mask; you create the value by the bitwise OR of the appropriate parameters (using the ‘ | ’ operator in C). See File Status Flags, for the parameters available.

The normal return value from open is a non-negative integer file descriptor. In the case of an error, a value of -1 is returned instead. In addition to the usual file name errors (see File Name Errors), the following errno error conditions are defined for this function:

The file exists but is not readable/writable as requested by the flags argument, or the file does not exist and the directory is unwritable so it cannot be created.

Both O_CREAT and O_EXCL are set, and the named file already exists.

The open operation was interrupted by a signal. See Interrupted Primitives.

The flags argument specified write access, and the file is a directory.

The process has too many files open. The maximum number of file descriptors is controlled by the RLIMIT_NOFILE resource limit; see Limits on Resources.

The entire system, or perhaps the file system which contains the directory, cannot support any additional open files at the moment. (This problem cannot happen on GNU/Hurd systems.)

The named file does not exist, and O_CREAT is not specified.

The directory or file system that would contain the new file cannot be extended, because there is no disk space left.

O_NONBLOCK and O_WRONLY are both set in the flags argument, the file named by filename is a FIFO (see Pipes and FIFOs), and no process has the file open for reading.

The file resides on a read-only file system and any of O_WRONLY , O_RDWR , and O_TRUNC are set in the flags argument, or O_CREAT is set and the file does not already exist.

If on a 32 bit machine the sources are translated with _FILE_OFFSET_BITS == 64 the function open returns a file descriptor opened in the large file mode which enables the file handling functions to use files up to 2^63 bytes in size and offset from -2^63 to 2^63. This happens transparently for the user since all of the low-level file handling functions are equally replaced.

This function is a cancellation point in multi-threaded programs. This is a problem if the thread allocates some resources (like memory, file descriptors, semaphores or whatever) at the time open is called. If the thread gets canceled these resources stay allocated until the program ends. To avoid this calls to open should be protected using cancellation handlers.

The open function is the underlying primitive for the fopen and freopen functions, that create streams.

Function: int open64 (const char * filename , int flags [, mode_t mode ])

Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | See POSIX Safety Concepts.

This function is similar to open . It returns a file descriptor which can be used to access the file named by filename . The only difference is that on 32 bit systems the file is opened in the large file mode. I.e., file length and file offsets can exceed 31 bits.

When the sources are translated with _FILE_OFFSET_BITS == 64 this function is actually available under the name open . I.e., the new, extended API using 64 bit file sizes and offsets transparently replaces the old API.

Obsolete function: int creat (const char * filename , mode_t mode )

Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | See POSIX Safety Concepts.

This function is obsolete. The call:

is equivalent to:

If on a 32 bit machine the sources are translated with _FILE_OFFSET_BITS == 64 the function creat returns a file descriptor opened in the large file mode which enables the file handling functions to use files up to 2^63 in size and offset from -2^63 to 2^63. This happens transparently for the user since all of the low-level file handling functions are equally replaced.

Obsolete function: int creat64 (const char * filename , mode_t mode )

Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | See POSIX Safety Concepts.

This function is similar to creat . It returns a file descriptor which can be used to access the file named by filename . The only difference is that on 32 bit systems the file is opened in the large file mode. I.e., file length and file offsets can exceed 31 bits.

Читать еще:  Dot net linux

To use this file descriptor one must not use the normal operations but instead the counterparts named *64 , e.g., read64 .

When the sources are translated with _FILE_OFFSET_BITS == 64 this function is actually available under the name open . I.e., the new, extended API using 64 bit file sizes and offsets transparently replaces the old API.

Function: int close (int filedes )

Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | See POSIX Safety Concepts.

The function close closes the file descriptor filedes . Closing a file has the following consequences:

  • The file descriptor is deallocated.
  • Any record locks owned by the process on the file are unlocked.
  • When all file descriptors associated with a pipe or FIFO have been closed, any unread data is discarded.

This function is a cancellation point in multi-threaded programs. This is a problem if the thread allocates some resources (like memory, file descriptors, semaphores or whatever) at the time close is called. If the thread gets canceled these resources stay allocated until the program ends. To avoid this, calls to close should be protected using cancellation handlers.

The normal return value from close is ; a value of -1 is returned in case of failure. The following errno error conditions are defined for this function:

The filedes argument is not a valid file descriptor.

The close call was interrupted by a signal. See Interrupted Primitives. Here is an example of how to handle EINTR properly:

When the file is accessed by NFS, these errors from write can sometimes not be detected until close . See I/O Primitives, for details on their meaning.

Please note that there is no separate close64 function. This is not necessary since this function does not determine nor depend on the mode of the file. The kernel which performs the close operation knows which mode the descriptor is used for and can handle this situation.

To close a stream, call fclose (see Closing Streams) instead of trying to close its underlying file descriptor with close . This flushes any buffered output and updates the stream object to indicate that it is closed.

C fopen vs open

181 LJM [2009-11-02 00:49:00]

Есть ли какая-либо причина (кроме синтаксических), которую вы хотите использовать

при использовании C в среде Linux?

c linux unix file-io fopen

11 ответов

206 Решение Omnifarious [2009-11-02 01:00:00]

Во-первых, нет особой причины использовать fdopen если fopen является опцией, а open — другой возможный выбор. Вы не должны были использовать open чтобы открыть файл, если вы хотите FILE * . Поэтому включение fdopen в этот список неверно и сбивает с толку, потому что оно не очень похоже на другие. Теперь я перейду к его игнорированию, потому что важное различие здесь — между стандартным FILE * C FILE * и дескриптором файла, специфичным для ОС.

Есть четыре основные причины использовать fopen вместо open .

  1. fopen обеспечивает буферизацию ввода-вывода, которая может оказаться намного быстрее, чем то, что вы делаете с open .
  2. fopen выполняет перевод конца строки, если файл не открывается в двоичном режиме, что может быть очень полезно, если ваша программа портирована в не-Unix среду.
  3. FILE * дает вам возможность использовать fscanf и другие функции stdio.
  4. Возможно, когда-нибудь ваш код придется перенести на другую платформу, которая поддерживает только ANSI C и не поддерживает функцию open .

На мой взгляд, перевод конца строки чаще встречается у вас на пути, чем помогает, а синтаксический анализ fscanf настолько слаб, что вы неизбежно в конечном итоге выбрасываете его в пользу чего-то более полезного.

И большинство платформ, поддерживающих C, имеют open функцию.

Это оставляет вопрос буферизации. В местах, где вы в основном читаете или пишете файл последовательно, поддержка буферизации действительно полезна и значительно повышает скорость. Но это может привести к некоторым интересным проблемам, при которых данные не попадают в файл, когда вы ожидаете, что они там будут. Вы должны помнить fclose или fflush в подходящее время.

Если вы выполняете поиск (то есть fsetpos или fseek второй из которых немного сложнее использовать в соответствии со стандартами), полезность буферизации быстро снижается.

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

44 Emil H [2009-11-02 00:53:00]

open() — это низкоуровневый вызов os. fdopen() преобразует дескриптор файла os-уровня в FILE-абстракцию языка C более высокого уровня. fopen() вызывает open() в фоновом режиме и дает вам FILE-указатель напрямую.

Существует несколько преимуществ использования файловых дескрипторов FILE-объектов, а также простота использования, а также другие технические преимущества, такие как встроенная буферизация. Особенно буферизация обычно приводит к значительному повышению производительности.

23 Yogeesh H T [2015-11-26 15:07:00]

fopen vs open в C

1) fopen является библиотечной функцией, а open является системным вызовом .

2) fopen обеспечивает буферизованный IO, который быстрее сравнивается с open , который не буферизирован.

3) fopen переносимый, а open не переносимый (open — это специфический для среды).

4) fopen возвращает указатель на структуру FILE (FILE *); open возвращает целое число, идентифицирующее файл.

5) A FILE * дает вам возможность использовать fscanf и другие функции stdio.

11 dreamlax [2009-11-02 00:53:00]

Если у вас есть FILE * , вы можете использовать такие функции, как fscanf , fprintf и fgets и т.д. Если у вас есть только дескриптор файла, вы ограничены (но, скорее, быстрее) процедуры ввода и вывода read , write и т.д.

10 user7116 [2009-11-02 00:58:00]

Если вы не являетесь частью 0.1% приложений, где использование open является фактическим преимуществом производительности, действительно нет веской причины не использовать fopen . Что касается fdopen , если вы не играете с файловыми дескрипторами, вам не нужен этот вызов.

Придерживайтесь fopen и его семейства методов ( fwrite , fread , fprintf и др.), и вы будете очень довольны. Также важно, что другие программисты будут довольны вашим кодом.

7 digy [2010-05-05 12:31:00]

Использование open, read, write означает, что вам приходится беспокоиться о взаимодействии с сигналами.

Если вызов был прерван обработчиком сигнала, функции возвратят -1 и установите errno в EINTR.

Читать еще:  Ms sql linux

Таким образом, правильный способ закрыть файл будет

open() — системный вызов, специфичный для Unix-систем, и он возвращает дескриптор файла. Вы можете записать в дескриптор файла, используя write() который является другим системным вызовом.
fopen() — это вызов функции ANSI C, который возвращает указатель на файл и переносим на другие ОС. Мы можем записать указатель в файл, используя fprintf .

В Unix:
Вы можете получить указатель файла из дескриптора файла, используя:

Вы можете получить дескриптор файла из указателя файла, используя:

open() будет вызываться в конце каждой из семейных функций fopen(). open() — системный вызов, а fopen() предоставляются библиотеками в качестве функций обертки для удобства пользователя

Зависит также от того, какие флаги необходимы для открытия. В отношении использования для записи и чтения (и переносимости) f * следует использовать, как указано выше.

Но если в основном вы хотите указать больше стандартных флагов (например, флагов rw и append), вам придется использовать API-интерфейс платформы (например, POSIX open) или библиотеку, которая абстрагирует эти детали. В C-стандарте нет таких флагов.

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

Например, в системах Linux есть интерфейс интерфейса, открытый через sysfs. Он отображает яркость светодиода через файл. Запись или чтение числа в виде строки в диапазоне от 0 до 255. Конечно, вы не хотите создавать этот файл и писать только в том случае, если он существует. Теперь классная вещь: используйте fdopen для чтения/записи этого файла с помощью стандартных вызовов.

Я изменил на open() из fopen() для моего приложения, потому что fopen вызывал двойные чтения каждый раз, когда я запускал fopen fgetc. Двойное чтение искажало то, что я пытался выполнить. open() просто делает то, что вы просите об этом.

-1 prashad [2014-10-22 19:20:00]

открытие файла с помощью fopen
прежде чем мы сможем прочитать (или записать) информацию из (на) файла на диске, мы должны открыть файл. чтобы открыть файл, который мы назвали функцией fopen.

это способ поведения функции fopen
есть некоторые причины при буферизации, это может быть тайм-аут. поэтому при сравнении fopen (высокоуровневый i/o) с системным вызовом open (низкоуровневый i/o), и это быстрее, чем fopen.

TechyTalk

Thoughts on Magento, PHP, Linux and open source

Linux system programming: Open file, read file and write file

This is my first article in what I’m hoping will be a series of articles on system programming for POSIX compliant operating systems with focus on Linux. Actually I’ve touched this topic a while ago when I wrote three articles about library programming on Linux (static libraries, dynamic libraries and dynamic libraries using POSIX API). In this series my goal is to go trough basics of Linux system programming from the easiest topics like open file, read file and file write to a bit more complicated things like Berkeley sockets network programming. So lets get started with environment setup and an example of program that copies source file into destination file using POSIX API system calls to demonstrate open(), read() and write() system calls on Linux operating system.

Configuring your environment

I’ll use my trustworthy Ubuntu Linux operating system but you can actually use any POSIX compliant operating system, the only difference will probably be that you will need to configure your environment differently. What we need to begin with Linux system programming is gcc compiler with related packages and POSIX related man pages. So here’s how to install this packages on Ubuntu based operating system:

Basically that’s all you need to create serious system tools for Linux operating system. Later we will probably need some more libraries but we will install them when necessary.

open(), read() and write() system calls

If you have named this code file sp_linux_copy.c and if you want to name executable file sp_linux_copy to compile this program you would probably use something like this:

Then if your source file is named source_file.txt and if you want to name the destination file destination_file.txt you would run this program like this:

Now lets go trough the code and explain tricky parts. First thing we must do is to include necessary header files. Man page of every system call tells you what header files you need to include to be able to use this system call. Second we will define constant we will use to define size of our buffer in bytes. Smaller buffer size will make our copy process longer but it will save memory. Next we open source and destination file descriptors, source with O_RDONLY to make it read only, destination with O_WRONLY | O_CREAT to make it writable and to create destination file with 0644 file system permission flags. In case of error we use perror() man 3 perror to print relatively user friendly error message.

Now we are ready to start copy process. We run read() and write() inside loop (because source file might be bigger than our buffer) to copy from one file into another. Important to notice is that write() is using number of bytes read from source file returned by read() so it would know how much to write into destination file. If number of bytes read (ret_in) and number of bytes written (ret_out) differ this indicates error so once again we use perror() to print out error description. At the end if all went well we do cleanup by closing both file descriptors and returning 0 (EXIT_SUCCESS) to indicate that program ended without errors.

That’s it for this introductory article on Linux system programming topic. In my next article I will show you few more examples on POSIX input/output and then move on to memory management related system calls.

A quality focused Magento specialized web development agency. Get in touch!

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