Lab4
.docxЛабораторная работа № 4
Студента ИТ 14-1 Красовского Абхая
Технологии обмена данными между процессами: файлы, отображаемые в память
Вариант №9
Цель: Получить навыки в следующих предметных областях:
-
создание и использование файлов, отображаемых в память;
-
создание и использование процессов
Индивидуальное задание
Реализовать задание c взаимодействием потоков, процессов и объекта файлового отображения.
Код процесса №1:
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
using namespace std;
using namespace boost;
#define BUF_SIZE 256
TCHAR Name[]=TEXT("MyFileMappingObject");
TCHAR Msg[]=TEXT("Message from first process");
mutex hMutex;
HANDLE hSem, hMapFile;
LPCTSTR pBuf; // LPCTSTR - указатель на константную строку, без UNICODE.
void ThrF1()
{
hMutex.lock();
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // использование файла подкачки
NULL, // защита по умолчанию
PAGE_READWRITE, // доступ к чтению/записи
0, // макс. размер объекта
BUF_SIZE, // размер буфера
Name); // имя отраженного в памяти объекта
if (hMapFile == NULL)
cout << ("Не может создать отраженный в памяти объект (%d).\n", GetLastError());
hMutex.unlock();
}
void ThrF2()
{
WaitForSingleObject(hSem, INFINITE);
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // дескриптор отраженного в памяти объекта // MapViewofFIle возвращает начальный адрес отображаемого представления или NULL, ошибку, которая ловится функцие GetLastError()
FILE_MAP_ALL_ACCESS, // разрешение чтения/записи
0, // старшее DWORD смещения
0, // младшее DWORD смещения
BUF_SIZE); // число отображаемых байтов
if (pBuf == NULL)
{
cout << ("Представление проецированного файла невозможно (%d).\n", GetLastError());
}
ReleaseSemaphore(hSem, 1, 0);
}
void ThrF3()
{
WaitForSingleObject(hSem, INFINITE);
CopyMemory( // CopyMemory копирует блок памяти из одного места в другой с использованием указателей.
(PVOID)pBuf, // Указатель на адрес памяти для использования
Msg, // Указатель на адрес памяти из которого будут копироваться данные
strlen(Msg)); // Число копируемых байтов
ReleaseSemaphore(hSem, 1, 0);
}
void main()
{
setlocale(LC_ALL, "ru");
hSem = CreateSemaphore(NULL, 1, 1, NULL);
thread thr1(ThrF1);
thread thr2(ThrF2);
thread thr3(ThrF3);
thr1.join();
thr2.join();
thr3.join();
WaitForSingleObject(hSem, INFINITE);
_getch();
UnmapViewOfFile(pBuf); // удаление проецируемого файла из памяти
CloseHandle(hMapFile);
CloseHandle(hSem);
thr1.~thread();
thr2.~thread();
thr3.~thread();
}
Код процесса №2:
#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;
#define BUF_SIZE 256
TCHAR szName[]=TEXT("MyFileMappingObject");
void main()
{
setlocale(LC_ALL, "ru");
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // доступ к чтению/записи
FALSE, // имя не наследуется
szName); // имя "проецируемого " объекта
if (hMapFile == NULL)
{
cout << "Невозможно открыть объект *проекция файла* (%d).\n", GetLastError();
}
pBuf = (LPCTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
if (pBuf == NULL)
{
cout << "Представление проецированного файла не возможно (%d).\n", GetLastError();
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
Результат: