prosdo.ru
добавить свой файл
1 2 3 4


Лабораторная работа № ОС-7
Межпроцессное взаимодействие
Цель работы: Изучение механизмов межпроцессного взаимодействия (InterProcess Communication) в Windows NT. Получение практических навыков по использованию Win32 API для программирования механизмов IPC.
Содержание работы

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

Отображение файлов (file mapping)


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

Программист может использовать специальный вид отображения файла для обеспечения именованной разделенной памяти между процессами. Если при создании объекта-отображения файла указывается файл подкачки системы (swapping file), то отображение файла создается как блок совместно используемой памяти. Другие процессы также могут получить доступ к этому блоку, открыв такое же отображение файла.

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

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


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

Первый процесс вызывает функцию CreateFileMapping для того, чтобы создать объект-отображение файла с именем MyFileMappingObject. Используя флаг PAGE_READWRITE, процесс назначает права на чтение и запись данных при работе с файловым отображением.
Функция CreateFileMapping создает или открывает именованный или неименованный объект-отображение файла и имеет следующее определение (по MSDN 2001):
HANDLE CreateFileMapping(

HANDLE hFile, // дескриптор файла для отображения

LPSECURITY_ATTRIBUTES lpAttributes, // атрибуты безопасности

DWORD flProtect, // флаги защиты

DWORD dwMaximumSizeHigh, // старшие DWORD максимального размера

DWORD
dwMaximumSizeLow, // младшие DWORD максимального размера

LPCTSTR lpName // имя объекта-отображения файла

);
HANDLE hMapFile;
hMapFile = CreateFileMapping(hFile, // Дескриптор открытого файла

NULL, // Безопасность по умолчанию

PAGE_READWRITE, // Разрешение чтения/записи

0, // Максимальный размер объекта

0, // Текущий размер hFile

"MyFileMappingObject"); // Имя отображения файла
// Проверяем корректность создания отображения

if (hMapFile == NULL)

ErrorHandler("Не могу создать объект file-mapping.");
Затем процесс использует дескриптор hMapFile при вызове функции MapViewOfFile, чтобы создать представление содержимого файла в адресном пространстве процесса. Функция возвращает указатель на представление файла в памяти.

Синтаксис функции MapViewOfFile по MDSN 2001:

LPVOID MapViewOfFile(

HANDLE
hFileMappingObject, // дескриптор объекта-отображения файла

DWORD
dwDesiredAccess, // режим доступа

DWORD
dwFileOffsetHigh, // старший DWORD смещения

DWORD
dwFileOffsetLow, // младший DWORD смещения

SIZE_T
dwNumberOfBytesToMap // количество байт для сопоставления

);
LPVOID lpMapAddress;
lpMapAddress = MapViewOfFile(hMapFile, // Дескриптор объекта-отображения файла

FILE_MAP_ALL_ACCESS, // Разрешение чтения/записи

0, // Максимальный размер объекта

0, // Размер hFile

0); // Отображать файл целиком

if (lpMapAddress == NULL)

ErrorHandler("Не могу создать представление файла в памяти процесса.");
Второй процесс вызывает функцию OpenFileMapping с именем MyFileMappingObject, чтобы использовать тот же объект-отображение файла, что и первый процесс. Также как и первый процесс, второй использует функцию MapViewOfFile для сопоставления области памяти процесса отображаемому файлу.
Синтаксис функции OpenFileMapping по MDSN 2001:
HANDLE OpenFileMapping(

DWORD dwDesiredAccess, // режим доступа

BOOL bInheritHandle, // флаг наследования

LPCTSTR lpName // имя объекта

);
HANDLE hMapFile;

LPVOID lpMapAddress;
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // Разрешение чтения/записи

FALSE, // Не наследовать имя

"MyFileMappingObject"); // объекта-отображения файла.

if (hMapFile == NULL)

ErrorHandler("Не могу открыть объект-отображение файла.");
lpMapAddress = MapViewOfFile(hMapFile, // Дескриптор объекта-отображения файла.

FILE_MAP_ALL_ACCESS, // Разрешение чтения/записи

0, // Максимальный размер объекта

0, // Размер hFile.

0); // Отображать файл целиком


if (lpMapAddress == NULL)

ErrorHandler("Не могу создать представление файла в памяти процесса.");
2. Чтение/запись отображенных данных.

Для чтения из представления файла в памяти разыменуем указатель, полученный с помощью функции MapViewOfFile:
DWORD dwLength;
dwLength = *((LPDWORD) lpMapAddress);
Тот же указатель используется и для записи данных в отображенный файл:
*((LPDWORD) lpMapAddress) = dwLength;
Функция FlushViewOfFile копирует указанное количество байт представления файла в памяти в физический файл не ожидая пока произойдет операция кэшированной записи:
if (!FlushViewOfFile(lpMapAddress, dwBytesToFlush))

ErrorHandler("Не могу сохранить изменения на диск.");
3. Завершение работы с отображениями.

Каждый процесс вызывает функцию UnmapViewOfFile чтобы сделать недействительным указатель на отображенную память. Этим уничтожается сопоставление адресного пространства процесса объекту-отображению файла. Если это необходимо, функция UnmapViewOfFile также копирует измененные страницы памяти на диск.
if (!UnmapViewOfFile(lpMapAddress))

ErrorHandler("Не могу уничтожить сопоставление.");
Когда все процессы завершат использование объекта-отображения файла (вызвав предыдущую функцию), они должны закрыть дескрипторы объектов-отображений с помощью функции CloseHandle:
CloseHandle(hMapFile);
Замечание. В данном примере оставлены на самостоятельное рассмотрение вопросы, связанные с синхронизацией работы нескольких процессов, передающих данные через отображения файлов. Для обеспечения синхронизации см. лабораторную работу ОС-4.




следующая страница >>