Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 5:

Файловый ввод/вывод

Аннотация: Рассматриваются основные понятия, ассоциированные с вводом/выводом, описываются функции, предназначенные для открытия и закрытия файлов, выполнения операций ввода/вывода и сопутствующих действий.
Ключевые слова: операции, ввод/вывод, функции нижнего уровня, файловый дескриптор, буферизованный ввод/вывод, поток, управляемая буферизация, форматный ввод/вывод, открытие файла, описание открытого файла, адрес, операция ввода/вывода, ввод, вывод, стандартный протокол, запись, файл, позиционирование, индикатор, байт, конец файла, буфер, функция, связь, передача данных, Синхронный, асинхронный ввод/вывод, приостановка процесса, синхронный ввод/вывод, синхронизированный ввод/вывод, приложение, целостное состояние, память, информация, размер файла, целостность файлов, время последнего доступа, дескриптор, аргумент, значение, режим доступа, запрос, группа, указатель, объект, mode, цепочка символов, стандарт языка, очередь, имя файла, пространство, программа, чтение данных, fread, терминал, Произведение, признак конца файла, остаток, управляющий терминал, цикла, запись данных в файл, константы, длина, целое число, base64, endianness, порядок байт, rewind, Приращение, режим доступа к файлу, маска, смена программы процесса, класс, разделяемые данные, блокировка, доступ, сегменты, минимум, команда, управляющие операции с буферами, буферизация

Основные понятия

В стандарте POSIX-2001 предусмотрены две основные группы функций, обслуживающие операции ввода/вывода:

  • функции нижнего уровня, использующие упоминавшиеся ранее целочисленные файловые дескрипторы (эти функции и ассоциирован- ные объекты определены в заголовочном файле <fcntl.h> );
  • функции более высокого уровня, осуществляющие буферизованный ввод/вывод с применением потоков (см. <stdio.h> ).

Применение потоков не расширяет базовых возможностей ввода/вывода, поскольку в конечном счете используются функции нижнего уровня, но в отличие от них позволяет приложениям получить дополнительный сервис в виде управляемой буферизации и форматного ввода/вывода.

Согласно стандарту POSIX-2001, поток – это объект, служащий для доступа к файлам как к упорядоченной последовательности символов.

Поток представляется структурой типа FILE, с которой ассоциирован соответствующий дескриптор открытого файла . Несколько дескрипторов и/или потоков могут ссылаться на одно описание открытого файла.

Существенны не только содержимое, но и адрес объекта типа FILE ; копия подобного объекта не обязательно является корректным представлением потока.

И файловые дескрипторы, и потоки формируются в результате выполнения функций открытия файлов, которые должны предшествовать операциям ввода/вывода. Имеется, однако, три предопределенных потока: стандартный ввод, стандартный вывод и стандартный протокол, открываемые окружением времени выполнения еще перед началом работы C-программ. Для обращения к ним служат указатели на объекты типа FILE с именами, соответственно, stdin, stdout и stderr.

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

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

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

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

Стандартом C99 [5] предусмотрены байтные и широкие символы. Соответственно, в стандарте POSIX-2001 введено понятие ориентации потока, которая может быть широкой или байтной. Задает ориентацию первая после открытия файла   ввода/вывода операция. Если вначале применяется функция ввода/вывода широких символов, поток получает широкую ориентацию; в противном случае – байтную. Сменить ориентацию можно только повторным открытием файла ; применяемые к потоку функции ввода/вывода должны соответствовать его ориентации.

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

Стандарт POSIX-2001 предусматривает как синхронный, так и асинхронный ввод/вывод.

Операция асинхронного ввода/вывода сама по себе не способна привести к приостановке процесса ( потока управления) и лишить его возможности использовать процессор. Это означает, что процесс и асинхронная операция ввода/вывода могут выполняться параллельно.

При синхронном вводе/выводе процесс ( поток управления) приостанавливается до завершения запрошенной операции обмена данными.

С одним файлом могут параллельно работать несколько процессов, выполняющихся на разных хостах (узлах сети) и использующих разные буфера. Для корректного обслуживания подобной ситуации в стандарте POSIX-2001 определено (в качестве необязательной возможности) понятие синхронизированного ввода/вывода – так называют механизм, повышающий детерминированность и устойчивость средств обмена данными, поэтому приложение может быть уверено, что данные, которыми оно манипулирует, физически присутствуют на устройствах вторичной (массовой, стабильной) памяти и наряду с файлами находятся в целостном состоянии.

Операция синхронизированного ввода/вывода считается завершенной, когда данные успешно переданы или она диагностирована как неудачная. Различают завершение с целостностью данных и с целостностью файлов.

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

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

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

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?