Добавил:
abhai2013@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab4

.docx
Скачиваний:
2
Добавлен:
30.06.2018
Размер:
93.98 Кб
Скачать

Лабораторная работа № 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);

}

Результат:

Соседние файлы в предмете Операционные системы