Страница 14 из 15
Взаимодействие между процессами
Потоки одного процесса не имеют доступа к адресному пространству другого процесса. Однако существуют механизмы для передачи данных между процессами. Разделяемая память
Как уже говорилось, система виртуальной памяти в Win32 использует файл подкачки - swap file (или файл размещения - page file), имея возможность преобразования страниц оперативной памяти в страницы файла на диске и наоборот. Система может проецировать на оперативную память не только файл размещения, но и любой другой файл. Приложения могут использовать эту возможность. Это может использоваться для обеспечения более быстрого доступа к файлам, а также для совместного использования памяти. Такие объекты называются проекциями файлов (на оперативную память) (file-mapping object). Для создания проекции файла сначала вызывается функция CreateFileMapping(). Ей передается дескриптор (уже открытого) файла или указывается, что нужно использовать page file операционной системы. Кроме этого, в параметрах ей передается флаг защиты, максимальный размер проекции и имя объекта. Затем вызывается функция MapViewOfFile(). Она отображает представление файла (view of a file) в адресное пространство процесса. По окончании работы вызывается функция UnmapViewOfFile(). Она освобождает память и записывает данные в файл (если это не файл подкачки). Чтобы записать данные на диск немедленно, используется функция FlushViewOfFile(). Проекция файла, как и другие объекты ядра, может использоваться другими процессами через наследование, дублирование дескриптора или по имени.
Пример 11. Вот пример программы, которая создает проекцию в page file и записывает в нее данные. |
#include <windows.h>
void main() { HANDLE hMapping; char* lpData; char* lpBuffer; ... //Создание или открытие существующей проекции файла hMapping = CreateFileMapping( (HANDLE)(-1), // используем page file NULL, PAGE_READWRITE, 0, 0x0100, "MyShare"); if (hMapping == NULL) exit(0); // Размещаем проекцию hMapping в адресном пространстве нашего процесса; // lpData получает адрес размещения lpData = (char*) MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS,0,0,0); if (lpData == NULL) exit(0); // Копируем в проекцию данные memcpy ( lpData , lpBuffer ); ... // Заканчиваем работу. Освобождаем память. UnmapViewOfFile(lpData); // Закрываем объект ядра CloseHandle(hMapping); };
| Прочие механизмы (сокеты, pipe)
Кроме разделяемой памяти, в Windows есть и другие способы передачи информации между процессами, например, каналы, поименованные каналы и сокеты. Все они имеют сходный принцип и представляют собой своеобразный канал или соединение, "трубу", соединяющую процессы. Программа, имея один конец такого соединения, может читать и/или писать в него данные, обмениваясь таким образом информацией с программой на другом конце. Каналы используются для пересылки данных в одном направлении между дочерним и родительским процессами или между двумя дочерними процессами. Операции чтения/записи в канал похожи на подобные операции при работе с файлами. Поименованные каналы используются для двустороннего обмена данными между процессом-сервером и одним или несколькими процессами-клиентами. Как и анонимные каналы, они используют файлоподобный интерфейс, но, в отличие от первых, пригодны также для обмена данными по сети. Сокет - это абстрактный объект для обозначения одного из концов сетевого соединения, в том числе и через Internet. Сокеты Windows бывают двух типов: сокеты дейтаграмм и сокеты потоков. Интерфейс Windows Sockets (WinSock) основан на BSD-версии сокетов, но в нем имеются также расширения, специфические для Windows. |