
Лабораторная работа №4
.docx
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени
федеральное государственное бюджетное образовательное учреждение
высшего образования
Московский технический университет связи и информатики
----------------------------------------------------------------------------------------------
Кафедра Математической кибернетики и информационных технологий
ЛАБОРАТОРНАЯ РАБОТА № 4
по дисциплине
ОПЕРАЦИОННЫЕ СИСТЕМЫ
«Реализация обмена данными между процессами»
Выполнил:
студент Алгазин П.В.
группа БФИ1601
Проверил:
Королькова Т.В.
ст. пр. кафедры МКиИТ
Дата ___________________________
Москва 2018
Название работы: Реализация обмена данными между процессами.
Цель работы: Изучение набора средств коммуникации процессов в Windows NT. Получение практических навыков по использованию Win32 API для программирования механизмов межпроцессного взаимодействия.
Задание: Программа, выполняющая с помощью ВСЕХ перечисленных механизмов межпроцессного взаимодействия (отображение файлов, почтовые ящики, каналы)
Исходный код:
4
файловое
отображение
клиент
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
using
namespace std;
#define BUF_SIZE
256
TCHAR
szName[]=TEXT("Global\\MyFileMappingObject");
int
_tmain()
{
setlocale(LC_ALL,
"rus");
HANDLE
Event = CreateEventA(NULL, TRUE, FALSE, "First");
HANDLE
Event1 = CreateEventA(NULL, TRUE, FALSE, "Second");
HANDLE
Event2 = CreateEventA(NULL, TRUE, FALSE, "Ev");
cout«"Ожидание
запуска сервера...";
WaitForSingleObject(Event2,
INFINITE);
system("cls");
HANDLE
hMapFile;
LPCTSTR
pBuf;
hMapFile
=
CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUF_SIZE,szName);
pBuf
= (LPTSTR)
MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUF_SIZE);
char
a='y';
while
(a!='n')
{
cout«"Нахождение
транспонированной матрицы 5х5\n";
int
mas1[5][5];
int
mas2[5][5];
for(int
i=0;i<5;i++)
{
cout«"Введите
"«i«"-ю строку: ";
for(int
j=0;j<5;j++)
cin»mas1[i][j];
}
CopyMemory((PVOID)pBuf,
(LPVOID)&mas1,
sizeof(mas1));
SetEvent(Event);
WaitForSingleObject(Event1,
INFINITE);
ResetEvent
(Event1);
double
y;
memcpy(&mas2,pBuf,sizeof(mas2));
cout«"\nТранспонированная
матрица\n";
for(int
i=0;i<5;i++)
{
for(int
j=0;j<5;j++)
{
cout«mas2[i][j]«"\t";
}
cout«endl;
}
cout«"Повторить
еще раз? [y/n]
";
cin»a;
system("cls");
}
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return
0;
}
сервер
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
using
namespace std;
#pragma comment(lib,
"user32.lib")
#define BUF_SIZE
256
TCHAR
szName[]=TEXT("Global\\MyFileMappingObject");
int
_tmain()
{
setlocale(LC_ALL,
"rus");
HANDLE
Event = CreateEventA(NULL, TRUE, FALSE, "First");
HANDLE
Event1 = CreateEventA(NULL, TRUE, FALSE, "Second");
HANDLE
Event2 = CreateEventA(NULL, TRUE, FALSE,
"Ev");
SetEvent(Event2);
HANDLE
hMapFile;
LPCTSTR
pBuf;
cout«"Ожидание
сообщений\n";
WaitForSingleObject(Event,
INFINITE);
hMapFile
= OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,szName);
pBuf
= (LPTSTR) MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,
0,0,BUF_SIZE);
while
(TRUE)
{
WaitForSingleObject(Event,
INFINITE);
int
Buffer[5][5];
memcpy(&Buffer,pBuf,sizeof(Buffer));
cout«"Получено
сообщение: "«endl;
for(int
i=0;i<5;i++)
{
for(int
j=0;j<5;j++)
{
cout«Buffer[i][j]«"\t";
}
cout«endl;
}
//Нахождение
транспонированной матрицы
int
tmp;
for
(int i = 0; i < 5; i++)
for
(int j = 0; j < i; j++)
{
tmp
= Buffer[i][j];
Buffer[i][j]
= Buffer[j][i];
Buffer[j][i]
= tmp;
}
CopyMemory((PVOID)pBuf,
(LPVOID)&Buffer, sizeof(Buffer));
SetEvent(Event1);
ResetEvent
(Event);
}
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
Рисунок 1 - Результат выполнения