Асинхронный файловый ввод/вывод в операционной системе WINDOWS, страница 2

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

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

Обзор файлового ввода/вывода

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

Системный вызов, с помощью которого осуществляется открытие файла, называется CreateFile. На самом деле название этого вызова (в переводе на русский CreateFile — «создать файл») плохо отражает функции, которые он выполняет. В зависимости от флагов, которые вы передаете этому вызову, он может либо действительно создать новый файл, либо открыть уже существующий. Лучшим названием было бы не CreateFile, a CreateFileHandle — «создать дескриптор файла». И действительно, вызов CreateFile создает файлы далеко не всегда. Вместо этого он создает дескрипторы файлов, которые в дальнейшем используются для работы с файлами. Если файл с указанным именем уже существует на жестком диске, вызов CreateFile может либо открыть его, либо уничтожить его и создать новый файл с таким же именем. Если файла с указанным именем на вашем жестком диске еще нет, вызов CreateF-Пе создает такой файл. В любом случае вызов CreateFile создает дескриптор файла и возвращает его вызвавшей программе, которая может использовать этот дескриптор для дальнейшей работы с файлом!

Вызов CreateFilе принимает аргументы, перечисленные в табл. 1. Прежде всего, это — имя файла. Помимо имени, при создании или открытии файла следует указать режим доступа к файлу (для чтения - GENERIC_READ, записи – GENERIC_WRITE или для того и другого), режим совместного использования файла несколькими процессами, а также атрибуты безопасности. Пятый аргумент определяет, какие действия следует предпринять в случае, если файл с указанным именем уже существует, и что надо делать, если такого файла на диске нет. Шестой аргумент — это набор флагов, управляющих доступом к файлу, и атрибутов файловой системы, которыми будет обладать файл после создания. Наконец, последний, седьмой атрибут — это дескриптор шаблонного файла. Если вы передадите вызову CreateFile этот дескриптор, новый файл, созданный в результате обращения к вызову, будет обладать набором атрибутов, которым обладает шаблонный файл.

Наиболее интересным аргументом вызова CreateFile является предпоследний, шестой аргумент, который является набором флагов доступа к файлу и атрибутов файловой системы. Используя различные комбинации флагов (табл. 2), можно настроить доступ к файлу самым причудливым образом. Например, можно приказать системе удалить файл сразу же после того, как он будет закрыт, или объявить, что файл будет использоваться для перекрывающегося (overlapped) доступа (перекрывающийся доступ — базовый метод осуществления асинхронного ввода/вывода). Помимо прочего флаги позволяют управлять механизмом кэширования.

Аргументы функции CreateFile                                                  Таблица 1.