Центр справки и настройки Windows XP 3.8


Процессы в Windows - часть 14


/p>

int main(int argc, char* argv[]) { HANDLE Mutex; Mutex = CreateMutex(NULL,FALSE,"MyMutex"); if (ERROR_ALREADY_EXISTS == GetLastError()) // Такой мьютекс уже кем-то создан...

{ MessageBox(0,"Приложение уже запущено","Error",0); CloseHandle( Mutex); exit(0); } ... }

Взаимодействие между процессами

Потоки одного процесса не имеют доступа к адресному пространству другого процесса. Однако существуют механизмы для передачи данных между процессами.

Разделяемая память

Как уже говорилось, система виртуальной памяти в 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); };

<


Начало  Назад  Вперед



Книжный магазин