Лабораторная работа №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 - Результат выполнения