Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Выполнение отображения файла на память

Функция CreateFileMapping возвращает описатель объекта, представляющего файл, отображаемый на память. Используя его, можно выполнить само отображение, вызвав функции MapViewOfFile или MapViewOfFileEx. при вызове указывается идентификатор отображения и режим доступа, а также старшее и младшее слова смещения фрагмента в файле и количество отображаемых байт (размер фрагмента). Если в качестве размера задать 0, будет выполнено отображение всего файла. Смещение задается таким образом, чтобы оно попадало на границу минимального пространства памяти, которое можно зарезервировать (обычно подходит значение 64 кб). Более точную информацию о гранулярности памяти можно узнать с помощью функции GetSystemInfo.

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

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

Эти функции сами выполняют резервирование памяти, поэтому не нужно предварительно обращаться в функции VirtualAlloc.

Открытие отображения

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

Отмена отображения

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

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

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

Если приложение создало несколько отображений для файла, все они должны быть отменены.

После этого с помощью функции CloseHandle закрываются идентификаторы, полученные от функций CreateFileMapping и CreateFile.

Принудительная запись измененных данных

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

 

Глава 2. Каналы передачи данных

В среде ОС Windows NT доступно удобное средство передачи данных между процессами – каналы (pipe). Это средство позволяет передать информацию между как локальными процессами, так и между процессами, выполняющимися на различных компьютерах в сети.

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

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

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

¨ создание канала и подключение к каналу,

¨ выполнение операции чтения или записи,

¨ отключение от канала и закрытие его описателя.

Ниже описаны основные функции для работы с каналами.

Именование каналов

Существуют две разновидности каналов: именованные (Named Pipes) и неименованные (анонимные – Anonymous Pipes).

Именованным каналам при создании присваивается имя, которое доступно для других процессов – зная имя процесс может подключиться к каналу.

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

В общем случае имена каналов записываются в виде

\\ИмяСервера\pipe\ИмяКанала

Если процесс создает или открывает канал на своем компьютере, вместо имени сервера указывается символ ‘,’ (точка):

\\.\pipe\ИмяКанала

(процесс может создать канал только на том компьютере, на котором он выполняется, поэтому имя сервера указывать не нужно).

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

Функции для работы с каналами

Создание канала

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

¨ PHANDLE hReadPipe – адрес переменной, в которую будет записан дескриптор (описатель, идентификатор) канала для чтения данных;

¨ PHANDLE hWritePipe – адрес переменной, в которую будет записан дескриптор (описатель, идентификатор) канала для записи данных;

¨ LPSECURITY_ATTRIBUTES lpPipeAttributes – адрес переменной для атрибутов защиты;

¨ DWORD nSize – количество байт памяти, зарезервированной для канала.

В случае успешного создания канала функция возвращает значение TRUE, а при ошибке – FALSE (уточнить причину ошибки можно с помощью функции GetLastError).

Описатель hReadFile передается в качестве параметра при обращении к функциям ReadFile/ReadFileEx для выполнения операции чтения, а hWriteFile – обращении к функциям WriteFile/WriteFileEx для выполнения операции записи. Эти описатели возвращаются функцией.

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

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

Для создания именованного канала используется функция CreateNamedPipe. В ее прототипе специфицированы параметры:

¨ LPCTSTR lpName – адрес строки, содержащей имя канала;

¨ DWORD dwOpenMode – режим открытия канала;

¨ DWORD dwPipeMode – режим работы канала;

¨ DWORD nMaxInstances – максимальное количество реализаций канала;

¨ DWORD nOutBufferSize – размер выходного буфера в байтах;

¨ DWORD nInBufferSize – размер входного буфера в байтах;

¨ DWORD nDefaultTimeOut – время ожидания в миллисекундах;

¨ LPSECURITY_ATTRIBUTES lpPipeAttributes – адрес переменной для атрибутов защиты.

Канал может быть ориентирован или на передачу потока байтов (данные передаются по байтам), или на передачу сообщений (данные передаются отдельными блоками заданной длины). Режим работы канала (PIPE_TYPE_BYTE/PIPE_TYPE_MESSAGE) передается при его создании через параметр dwOpenMode. Режим PIPE_TYPE_BYTE используется по умолчанию. Кроме того, с помощью этого параметра можно передать с помощью констант режим испльзования канала (PIPE_ACCESS_INBOUND – только для чтения, PIPE_ACCESS_outBOUND – только для записи, PIPE_ACCESS_DUPLEX – для чтения и записи (эти параметры должны быть одинаковы для всех реализаций канала); PIPE_READMODE_BYTE – чтение в режиме последовательной передачи байтов, PIPE_READMODE_MESSAGE – чтение в режиме передачи отдельных сообщений указанной длины, PIPE_WAIT – работа в блокирующем режиме (процесс переводится в состояние ожидания для завершения операций в канале), PIPE_NOWAIT – неблокирующий режим работы канала (если операция с каналом не может быть выполнена немедленно, функция завершается ошибкой), FILE_FLAG_OVERLAPPED – использование асинхронных операций, FILE_FLAG_WRITE_THROUGH – в режиме передачи байтов на удаленный компьютер функции, работающие с каналом, не возвращают управление до тех пор, пока не будет полностью завершена операция на удаленном компьютере (эти параметры могут отличаться для различных реализаций канала)). Дополнительно к перечисленным через данных параметр можно передать также флаги защиты (WRITE_DAC – вызывающий процесс должен иметь права доступа на запись к произвольному управляющему списку доступа ACL именованного канала; WRITE_OWNER – вызывающий процесс должен иметь права доступа на запись к процессу, владеющему именованным каналом; ACCESS_SYSTEM_SECURITY – вызывающий процесс должен иметь права доступа на запись к управляющему списку ACL доступа именованного канала).

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

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

Параметр nDefaultTimeOut определяет время ожидания для реализации канала (для всех реализаций необходимо указать одинаковое значение параметра).

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

Для создания и открытия канала можно также использовать функцию CreateFile. При этом вместо имени файла указывается имя канала.

Установка соединения с каналом

После создания серверным процессом канала он может перейти в режим соединения с клиентским процессом. Соединение со стороны серверного процесса выполняется с помощью функции ConnectNamedPipe. Эта функция возвращает значение типа BOOL. При вызове ей передаются параметры:

¨ HANDLE hNamedPipe – идентификатор именованного канала;

¨ LPOVERLAPPED lpOverLapped – адрес структуры OVERLAPPED.

При успешном завершении возвращается значение TRUIE, в случае ошибки – FALSE.

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

Второй параметр используется только для организации асинхронного взаимодействия через канал. Если будут использоваться только синхронные операции, в качестве значения указывается NULL. Если передано значение NULL, функция выполняется в синхронном режиме. Для канала, созданного в синхронном блокирующем режиме (PIPE_WAIT), функция переходит в состояние ожидания соединения с клиентским процессом. Если канал создан в синхронном неблокирующем режиме, значение TRUE возвращается немедленно, если клиент отключен от данной реализации канала и возможно его подключение; в противном случае возвращается значение FALSE (анализ ошибки можно выполнить с помощью GetLastError, которая может вернуть информацию о причине ошибки: значение ERROR_PIPE_LISTENING – к серверу еще не подключен ни один клиент; ERROR_PIPE_CONNECTED – клиент уже подключен; ERROR_NO_DATA – предыдущий клиент отключился от сервера, но еще не завершил соединение).

Для создания канала клиентский процесс может воспользоваться функцией CreateFile. С ее помощью можно открыть канал, если вместо имени файла указать имя канала. Функция возвращает описатель (тип HANDLE), а при вызове указываются следующие параметры:

¨ LPCTSTR lpFileName – адрес строки, содержащей имя;

¨ DWORD dwDesiredAccess – режим доступа;

¨ DWORD dwShareMode – режим совместного использования;

¨ LPSECURITY_ATTRIBUTES lpSecurityFttributes – дескриптор защиты;

¨ DWORD dwCreationDistribution – параметры создания;

¨ DWORD dwFlagsAndAttributes – атрибуты файла;

¨ HANDLE hTemplateFile – идентификатор файла с атрибутами.

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

При определении типа доступа к каналу можно использовать комбинацию следующих констант:

¨ 0 – доступ запрещен, но приложение может определить атрибуты канала, файла или устройства, открываемого функцией;

¨ GENERIC_READ – разрешен доступ на чтение;

¨ GENERIC_WRITE – разрешен доступ на запись.

Тип доступа, указанный при вызове этой функции не должен противоречить типу доступа, указанному при создании канала.

Для параметра, задающего режим совместного использования, можно указать следующие значения:

¨ 0 – совместное использование запрещено;

¨ FILE_SHARE_READ – другие приложения могут открыть файл для чтения;

¨ FILE_SHARE_WRITE – другие приложения могут открыть файл НА ЗАПИСЬ.

Если дескриптор защиты не указывается, то нужно задать значение NULL.

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

¨ CREATE_NEW – если файл уже существует, возвращается код ошибки;

¨ CREATE_ALWAYS – существующий файл переписывается, его содержимое теряется;

¨ OPEN_EXISTING – открывается существующий файл, если же файл не существует, возвращается код ошибки;

¨ OPEN_ALWAYS – если файл существует, он открывается, если файл не существует, он будет создан;

¨ TRUNCATE_EXISTING – существующий файл открывается и его длина усекается до 0 (содержимое стирается); если файла нет, возвращается код ошибки.

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

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

Запись данных в канал

Запись данных в открытый канал осуществляется с помощью функции WriteFile аналогично записи в обычный файл. Через первый параметр этой функции передается описатель реализации канала (HANDLE), полученный при создании. Второй параметр – это адрес буфера, данные из которого будут записаны в канал, а размер этого буфера указывается через третий параметр. Следующий параметр используется для определения числа байт, действительно записанных в канал. Значение последнего параметра зависит от режима записи (для записи в синхронном режиме указывается значение NULL).

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

Чтение данных из канала

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

Последнее изменение этой страницы: 2016-08-11

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...