Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Теоретические сведения. Функция CreateFileMapping возвращает дескриптор объекта "проецируемый файл"



Функция CreateFileMapping возвращает дескриптор объекта "проецируемый файл". Этот дескриптор должен использоваться при создании представления файла так, чтобы Вы могли получить доступ к совместно используемой памяти. Когда Вы вызываете CreateFileMapping, то задайте имя объекта, число байтов, которые отобразятся из файла и разрешение чтения - записи в отображаемой памяти. Первый процесс, который вызывает функцию CreateFileMapping, создает объект "проецируемый файл". Процессы, вызывающие CreateFileMapping для существующего объекта получают его дескриптор. Вы можете убедиться, успешно или нет завершился вызов CreateFileMapping, который создавал или открывал объект "проецируемый файл", при помощи вызова функция GetLastError.GetLastError возвращает значение NO_ERROR создающему процессу и ERROR_ALREADY_EXISTS последующим процессам.

Функция CreateFileMapping завершается ошибкой, если флажки доступа находятся в противоречии с установленными тогда, когда функция CreateFile открывала файл. Например, чтобы читать и записывать в файл:

Установите значения GENERIC_READ и GENERIC_WRITE в параметре fdwAccess функции CreateFile.

Установите значение PAGE_READWRITE в параметре fdwProtect функции CreateFileMapping.

Процедура создания объекта "проецируемый файл" не закрепляет физическую память, она только резервирует её.

Размер проецируемого в память файла

Размер объекта "проецируемый файл" не зависит от размера отображаемого файла. Однако, если объект "проецируемый файл" является большим чем файл, система увеличивает файл до возвращения значения функцией CreateFileMapping. Если объект "проецируемый файл" является меньшим чем файл, система проецирует только определенное число байтов из файла.

Параметры dwMaximumSizeHigh и dwMaximumSizeLow функции CreateFileMapping дают возможность устанавливать число байтов, которые будут отображаться из файла:

Размер объекта "проецируемый файл" выбирается при помощи контроля, как далеко в файле с отображением в памяти Вы можете "видеть". Если Вы создаете 500 килобайтный объект "проецируемый файл", Вы имеете доступ только к первым 500 КБ файла, независимо от размера его файла. Так как, чтобы создать больший объект "проецируемый файл", не требуется от Вас системных ресурсов, создайте его по размерам одинаковым с файлом (установив нули в обоих параметрах dwMaximumSizeHigh и dwMaximumSizeLow функции CreateFileMapping), даже если Вы не предполагаете просматривать весь файл. В затраты системных ресурсов входит создание представлений и доступа к ним.

Если Вы хотите просмотреть часть файла, которая начинается не в начале файла, Вы должны создать объект "проецируемый файл". Этот объект - размер части файла, который Вы хотите просмотреть плюс смещение в файле.

Чтобы спроецировать данные из файла в виртуальную память процесса, Вы должны создать представление файла. Функции MapViewOfFile и MapViewOfFileEx используют дескриптор объекта "проецируемый файл", возвращенный CreateFileMapping, чтобы создать представление файла или его части в виртуальном адресном пространстве процесса. Эти функции завершаются ошибкой, если флажки доступа находятся в противоречии с флажками определенными тогда, когда CreateFileMapping создавала объект "проецируемый файл".

Функция MapViewOfFile возвращает указатель на представление файла. При помощи разыменования (получения значения объекта, к которому отсылает данный указатель) указателя в диапазоне адресов, определенных в функции MapViewOfFile, приложение может читать данные из файла и писать данные в файл. Запись в представление файла происходит в результате изменений в объекте "проецируемый файл". Фактическая запись в файл на диске обрабатывается системой. Данные в действительности не перемещаются, когда идет запись в объект "проецируемый файл". Вместо этого, большая часть файлового ввода и вывода (I/O) данных кэшируется, чтобы улучшить общую производительность системы. Приложения могут отменить этот режим работы при помощи вызова функции FlushViewOfFile, чтобы заставить систему выполнять дисковые транзакции (групповые операции) немедленно.

Чтобы читать из представления данных файла, разименуйте указатель, возвращенный функцией MapViewOfFile как показано в примере ниже:

DWORDdwLength;dwLength= *((LPDWORD)lpMapAddress);

Процесс также использует указатель, возвращенный MapViewOfFile, чтобы и записать в представление данных файла:

*((LPDWORD) lpMapAddress) = dwLength;

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

if (!FlushViewOfFile(lpMapAddress, dwBytesToFlush)) { printf("Could not flush memory to disk (%d).\n", GetLastError()); }

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

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

if (!UnmapViewOfFile(lpMapAddress)) { ErrorHandler("Could not unmap view of file."); }

Отмена отображения файла аннулирует указатель на виртуальное адресное пространство процесса. Если какая - либо из страниц представления файла изменилась, с тех пор как представление было отображено, система записывает измененные страницы файла на диск, используя кэширование. Чтобы передать данные на диск немедленно, вызовите функцию FlushViewOfFile перед прекращением отображения представления файла.

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





Дата публикования: 2015-10-09; Прочитано: 318 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...