Проецирование файловых данных на адресное пространство процесса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Проецирование файловых данных на адресное пространство процесса



Проецирование файловых данных на адресное пространство процесса выполняет следующая функция:

function MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh: DWORD; dwFileOffsetLow: DWORD; dwNumberOfBytesToMap: DWORD): Pointer;

Где

hFileMappingObject – дескриптор объекта «файл, проецируемый в память», возвращаемый функцией CreateFileMapping или OpenFileMapping.

dwDesiredAccess – определяет вид доступа к данным. Возможные значения параметра dwDesiredAccess приведены в таблице 4.6.

 

Таблица 4.6 Возможные значения параметра dwDesiredAccess

Значение параметра dwDesiredAccess Описание
FILE_MAP_READ Файловые данные можно только считывать. Функция CreateFileMapping может быть предварительно вызвана с любым атрибутом защиты.
FILE_MAP_WRITE или FILE_MAP_ALL_ACCESS Файловые данные можно считывать и записывать. Функция CreateFileMapping предварительно должна быть вызвана с атрибутом защиты PAGE_READWRITE.
FILE_MAP_COPY Файловые данные можно считывать и записывать, но запись приводит к созданию копии страницы. Функция CreateFileMapping предварительно должна быть вызвана с атрибутом защиты PAGE_WRITECOPY.

dwFileOffsetHigh,

dwFileOffsetLow - определяют смещение в файле. Так как Windows поддерживает файлы и их проекции размером до 16 экзабайтов, то данные параметры используются для определения 64-битового адреса: dwFileOffsetHigh определяет старшие 32-бита, а dwFileOffsetLow –младшие 32 бита. Задаваемое смещение должно быть кратно гранулярности выделения ресурсов.

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

Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»

Для освобождения региона адресного пространства, содержащего спроецированный файл необходимо вызвать следующую фунцию:

function UnmapViewOfFile(lpBaseAddress: Pointer): Boolean;

где lpBaseAddress – базовый адрес освобождаемого региона, который должен совпадать со значением, полученным после вызова функции MapViewOfFile.

Закрытие объектов ядра «файл, проецируемый в память» и «файл»

Для закрытия объектов ядра «файл, проецируемый в память» и «файл» дважды вызывается функция:

function CloseHandle(hObject: THandle): Boolean;

где hObject – дескриптор объекта.

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

Примеры программ, выполняющих проецирование в память

Пример 1

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

VAR

hFile,hFileMap:THandle; pFile,Str:PChar; Size:Integer;

begin

Str:='Работа с файлами, проецируемыми в память'+#0;

hFile:=CreateFile('C:\file1.txt',GENERIC_READ OR GENERIC_WRITE,

FILE_SHARE_READ OR FILE_SHARE_WRITE, nil,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

If hFile=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]); exit;

end;

Size:=GetFileSize(hFile,nil)+StrBufSize(Str)+1;

hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil);

If hFileMap=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"', [GetlastError]);

CloseHandle(hFile); exit;

end;

pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);

If pFile=nil then

begin

ShowMessageFmt('Ошибка %d при проецировании в память', [GetlastError]);

CloseHandle(hFile); CloseHandle(hFileMap); exit;

end;

pFile[GetFileSize(hFile,nil)]:=#0;

//Добавление строки Str в конец файла, проецируемого в память

Strcat(pFile,Str); UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap);

end;

 

Пример 2

Данная программа перед каждым словом вставляет три восклицательных знака.

VAR

hFile,hFileMap:THandle; pFile:PChar; Size,Size1,i,j,q:Integer;

begin

hFile:=CreateFile('file1.txt',GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

If hFile=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]);

exit;

end;

Size1:=GetFileSize(hFile,nil);

// Размер файла увеличивается на 30 байт (считаем, что этого будет достаточно при вставке новых символов)

Size:=GetFileSize(hFile,nil)+30;

hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil);

If hFileMap=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"',[GetlastError]);

CloseHandle(hFile); exit;

end;

pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);

If pFile=nil then

begin

ShowMessageFmt('Ошибка %d при проецировании в память',[GetlastError]);

CloseHandle(hFile); CloseHandle(hFileMap); exit;

end;

For i:=Size1 to Size1+30 do pFile[i]:=' ';

//Поиск слов

i:=0;

While i<Size1 do

begin

If ((i=0) and (pFile[0]<>' ')) or((pFile[i]<>' ') and (pFile[i-1]=' ')) then

begin

For q:=1 to 3 do

begin

For j:=Size1+1 Downto i+1 do pFile[j]:=pFile[j-1]; Size1:=Size1+1;

end;

pFile[i]:='!'; pFile[i+1]:='!'; pFile[i+2]:='!'; i:=i+4;

end

else i:=i+1;

end;

UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap);

end;

4.4. Задания для самостоятельной работы

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

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

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

4. С помощью механизма проецирования в память добавьте к текстовому файлу вводимые с клавиатуры предложения. Каждое предложение начинайте с новой строки.

5. С помощью механизма проецирования в память выполните поиск и замену слов в текстовом файле.

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

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

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

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

10. С помощью механизма проецирования в память замените в текстовом файле все пробелы на три символа «_».

11. С помощью механизма проецирования в память замените в текстовом файле все двухзначные числа на четыре символа «*».

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

13. С помощью механизма проецирования в память удалите из текстового файла все знаки препинания.

14. С помощью механизма проецирования в память удвойте все вхождения некоторой буквы в файле. Напри­мер, текст «мама папа» должен иметь вид — «маамаа паапаа». Удваиваемая буква вводится с клавиатуры.

15. С помощью механизма проецирования в память удалите все вхождения некоторой буквы из файла. Напри­мер, текст «мама папа» должен иметь вид — «мм пп». Удаляемая буква вводится с клавиатуры. Подсчитайте количество удалений.

16. С помощью механизма проецирования в память проверьте, являются ли все слова в текстовом файле идентификаторами. Идентификатор – любое слово, состоящее из букв и цифр, причем, первый символ – буква.

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

18. С помощью механизма проецирования проверьте в текстовом файле правильность написания сочетаний «жи», «ши», «ча», «ща», «чу» и «щу» и исправьте ошибки.

19. По правилам машинописи после запятой в тексте все­гда ставится пробел. Составьте программу исправления ошибок такого типа в текстовом файле, используя механизм проецирования в память.

20. С помощью механизма проецирования в память удалите из текстового файла первое и последнее слова.

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Для каких целей используется механизм проецирования в память?

2. Чем механизм проецирования в память отличается от работы с виртуальной памятью?

3. Опишите последовательность действий при проецировании в память.

4. Что случится, если при завершении проецирования в память не закрывать дескрипторы объектов с помощью функции CloseHandle?

5. Можно ли при проецировании в память увеличить размер файла?

6. Каким образом выполняется проецирование в память файлов, размер которых больше 4 Гбайт?

ЛАБОРАТОРНАЯ РАБОТА № 5

СОЗДАНИЕ ПРОЦЕССОВ И ПОТОКОВ

Цель работы

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

· Чередование выполнения нескольких процессов с целью повышения степени использования процессора;

· Разделение ресурсов между процессами;

· Организация обмена данными между процессами и потоками;

· Изменение класса приоритета процесса и уровня приоритета потока.

Теоретическое введение

В теоретическом введении рассматриваются процедуры и функции ядра ОС Windows, применяемые для работы с процессами потоками.

Создание процесса

Для создания процесса используется функция CreateProcess, имеющая следующий вид:

function CreateProcess (lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;

bInheritHandles: Boolean; dwCreationFlags: DWORD;

lpEnvironment: Pointer; lpCurrentDirectory: PChar;

const lpStartupInfo: TStartupInfo;

var lpProcessInformation: TProcessInformation): Boolean; stdcall;

Входные параметры данной функции перечислены в таблице 5.1.

Таблица 5.1 Параметры функции CreateProcess

Параметр Описание
   
lpApplicationName Имя исполняемого файла
lpCommandLine Командная строка, передаваемая создаваемому процессу.
lpProcessAttributes Определяют наследование дочерним процессом свойств родительского процесса. Обычно lpProcessAttributes и lpThreadAttributes устанавливают равным nil, а bInheritHandles =false.
lpThreadAttributes
bInheritHandles

Продолжение таблицы 5.1

   
dwCreationFlags Флаги, определяющие характеристики данного процесса. Например, его приоритет.
lpEnvironment Указывает на блок памяти, хранящий строки переменных окружения. Обычно устанавливают в nil.
lpCurrentDirectory Строка, определяющая текущий каталог и диск. Если этот параметр - nil, рабочий каталог нового процесса будет тем же, что и у приложения породившего его.
lpStartupInfo Указатель на структуру TStartupInfo. Из всех полей данной структуры обязательным является только заполнение поля cb- размер в байтах данной структуры.
lpProcessInformation Указатель на структуру TProcessInformation, из которой родительский процесс может получить данные о создаваемом процессе.

Структура TStartupInfo. имеет следующий вид:

TStartupInfo = record

cb: DWORD; lpReserved: Pointer; lpDesktop: Pointer;

lpTitle: Pointer; dwX: DWORD; dwY: DWORD;

dwXSize: DWORD; dwYSize: DWORD;

dwXCountChars: DWORD; dwYCountChars: DWORD;

dwFillAttribute: DWORD; dwFlags: DWORD;

wShowWindow: Word; cbReserved2: Word; lpReserved2: Byte;

hStdInput: THandle; hStdOutput: THandle; hStdError: THandle;

end;

Описание полей структуры TStartupInfo приведены в таблице 5.2.

Таблица 5.2 Основные поля структуры TStartupInfo

Поле Описание
   
cb Размер структуры в байтах. Служит для контроля версий.
lpReserved Зарезервировано
lpDesktop Определяет имя рабочего стола, на котором запускается приложение.
lpTitle Используется для консольных приложений и определяет заголовок консольного окна. Если этот параметр – nil, то в заголовок выводится имя исполняемого файла.
dwX, dwY X иY координаты левого верхнего угла окна приложения. Измеряется в пикселах
dwXSize, dwYSize Ширина и высота (в пикселах) окна приложения

Продолжение таблицы 5.2

   
dwXCountChars, dwYCountChars Определяют ширину и высоту (в символах) консольных окон
dwFillAttribute Задает цвет текста и фона в консольных приложениях
dwFlags Содержит набор флагов, позволяющих управлять созданием дочернего процесса
wShowWindow Определяет вид окна приложения
cbReserved2 Зарезервировано
lpReserved2 Зарезервировано
hStdInput, hStdOutput hStdError Описатели буферов для консольного ввода/вывода

 

Структура TProcessInformation имеет следующий вид:

TProcessInformation =record

hProcess: THandle; hThread: THandle; dwProcessId: DWORD;

dwThreadId: DWORD;

end;

Описание полей структуры TProcessInformation приведены в таблице 5.3. Структура TProcessInformation содержит выходные данные и заполняется функцией CreateProcess.

 

Таблица 5.3 Основные поля структуры TProcessInformation

Поле Описание
hProcess Дескриптор созданного процесса
hThread Дескриптор первичного потока
dwProcessId Идентификатор процесса
dwThreadId Идентификатор первичного потока

 

Если функция CreateProcess успешно выполнена, она возвращает значение true. Если произошла ошибка – возвращается false. Тогда информацию об ошибке можно получить, вызвав функцию GetLastError.



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 477; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.8.247 (0.046 с.)