Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ по лабораторным по ОС.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
649 Кб
Скачать
☆

Учебный проект

Первый процесс

Первый процесс создает объект "проекция файла" при помощи вызова функции CreateFileMapping с INVALID_HANDLE_VALUE и именем для объекта. Используя флажок PAGE_READWRITE, процесс будет иметь разрешение чтения - записи в память через посредство любых представлений данных файла, которые создаются.

Процесс затем использует дескриптор объекта "проекция файла", возвращенный CreateFileMapping при вызове MapViewOfFile, чтобы создать представление файла в адресном пространстве процесса. Функция MapViewOfFile возвращает указатель на представление данных файла.

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

#include <windows.h>

#include <stdio.h>

#include <conio.h>

#define BUF_SIZE 256

TCHAR szName[]=TEXT("MyFileMappingObject");

TCHAR szMsg[]=TEXT("Message from first process");

void main()

{

HANDLE hMapFile;

LPCTSTR pBuf;

hMapFile = CreateFileMapping(

INVALID_HANDLE_VALUE, // использование файла подкачки

NULL, // защита по умолчанию

PAGE_READWRITE, // доступ к чтению/записи

0, // макс. размер объекта

BUF_SIZE, // размер буфера

szName); // имя отраженного в памяти объекта

if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)

{

printf("Не может создать отраженный в памяти объект (%d).\n",

GetLastError());

return;

}

pBuf = (LPTSTR) MapViewOfFile(hMapFile, // дескриптор отраженного

// в памяти объекта

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

0,

0,

BUF_SIZE);

if (pBuf == NULL)

{

printf("Представление проецированного файла невозможно (%d).\n",

GetLastError());

return;

}

CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg));

getch();

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

}

 

Второй просесс

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

#include <windows.h>

#include <stdio.h>

#include <conio.h>

#define BUF_SIZE 256

TCHAR szName[]=TEXT("MyFileMappingObject");

void main()

{

HANDLE hMapFile;

LPCTSTR pBuf;

hMapFile = OpenFileMapping(

FILE_MAP_ALL_ACCESS, // доступ к чтению/записи

FALSE, // имя не наследуется

szName); // имя "проецируемого " объекта

if (hMapFile == NULL)

{

printf("Невозможно открыть объект "проекция файла" (%d).\n",

GetLastError());

return;

}

pBuf = MapViewOfFile(hMapFile, // дескриптор "проецируемого" объекта

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

0,

0,

BUF_SIZE);

if (pBuf == NULL)

{

printf("Представление проецированного файла не возможно (%d).\n",

GetLastError());

return;

}

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

}