Тимофеев 2018 / ОС 6 лаб
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ВТ
отчет
по лабораторной работе № 6 по дисциплине
«Операционные системы»
Тема: межпроцессное взаимодействие
Студент гр. 6307 |
|
Лазарев С. О. |
Преподаватель |
|
Тимофеев А.В. |
Санкт-Петербург
2018
Цель работы: исследовать управление файловой системой с помощью Win32 API.
Задание 6.1. Реализация решения задачи о читателях-писателях.
Лог файл работы процессов:
==============================================================
1545899247357: Writer PID(13224) - started
1545899247360: Writer PID(8104) - started
1545899247378: Writer PID(11620) - started
1545899247392: Writer PID(3464) - started
1545899247396: Writer PID(16136) - started
1545899247399: Writer PID(13512) - started
1545899247401: Writer PID(948) - started
1545899247408: Reader PID(8024) - started
1545899247414: Reader PID(11288) - started
1545899247417: Writer PID(14824) - started
1545899247427: Reader PID(2328) - started
1545899247435: Writer PID(520) - started
1545899247440: Reader PID(10584) - started
1545899247459: Reader PID(14024) - started
1545899247461: Reader PID(2400) - started
1545899247464: Reader PID(16260) - started
1545899247466: Reader PID(9204) - started
1545899247478: Reader PID(6196) - started
1545899852178: Writer PID(520) - waiting for semaphore
1545899852178: Writer PID(520) - writing page: 0
1545899853088: Writer PID(14824) - waiting for semaphore
1545899853089: Writer PID(14824) - writing page: 1
1545899853101: Writer PID(520) - releasing sources
1545899853112: Writer PID(520) - waiting for semaphore
1545899853112: Writer PID(520) - writing page: 0
1545899853528: Reader PID(16260) - waiting for semaphore
1545899853529: Reader PID(16260) - reading page: 2
1545899853682: Writer PID(520) - releasing sources
1545899853693: Writer PID(520) - waiting for semaphore
1545899853694: Writer PID(520) - writing page: 0
1545899853922: Reader PID(8024) - waiting for semaphore
1545899853922: Reader PID(8024) - reading page: 3
1545899854011: Writer PID(14824) - releasing sources
1545899854022: Writer PID(14824) - waiting for semaphore
1545899854022: Writer PID(14824) - writing page: 1
1545899854309: Reader PID(2328) - waiting for semaphore
1545899854310: Reader PID(2328) - reading page: 4
1545899854451: Reader PID(16260) - releasing sources
1545899854462: Reader PID(16260) - waiting for semaphore
1545899854593: Writer PID(14824) - releasing sources
1545899854593: Reader PID(16260) - reading page: 1
1545899854603: Writer PID(14824) - waiting for semaphore
1545899854604: Writer PID(14824) - writing page: 2
1545899854675: Reader PID(2400) - waiting for semaphore
1545899854844: Reader PID(8024) - releasing sources
1545899854855: Reader PID(8024) - waiting for semaphore
1545899855044: Reader PID(11288) - waiting for semaphore
1545899855087: Writer PID(520) - releasing sources
1545899855087: Reader PID(2400) - reading page: 0
1545899855098: Writer PID(520) - exiting
1545899855163: Reader PID(16260) - releasing sources
1545899855174: Reader PID(16260) - waiting for semaphore
1545899855231: Reader PID(2328) - releasing sources
1545899855242: Reader PID(2328) - waiting for semaphore
1545899855422: Writer PID(8104) - waiting for semaphore
1545899855422: Writer PID(8104) - writing page: 1
1545899855819: Writer PID(11620) - waiting for semaphore
1545899855819: Writer PID(11620) - writing page: 3
1545899855996: Writer PID(14824) - releasing sources
1545899855997: Reader PID(8024) - reading page: 2
1545899856007: Writer PID(14824) - exiting
1545899856010: Reader PID(2400) - releasing sources
1545899856020: Reader PID(2400) - waiting for semaphore
1545899856160: Reader PID(14024) - waiting for semaphore
1545899856344: Writer PID(8104) - releasing sources
1545899856345: Reader PID(11288) - reading page: 0
1545899856355: Writer PID(8104) - waiting for semaphore
1545899856356: Writer PID(8104) - writing page: 1
1545899856533: Writer PID(13224) - waiting for semaphore
1545899856533: Writer PID(13224) - writing page: 4
1545899856567: Reader PID(8024) - releasing sources
1545899856578: Reader PID(8024) - waiting for semaphore
1545899856742: Writer PID(11620) - releasing sources
1545899856742: Reader PID(16260) - reading page: 2
1545899856753: Writer PID(11620) - waiting for semaphore
1545899856753: Writer PID(11620) - writing page: 3
1545899856926: Writer PID(8104) - releasing sources
1545899856926: Reader PID(2328) - reading page: 1
1545899856937: Writer PID(8104) - waiting for semaphore
1545899856937: Writer PID(8104) - writing page: 5
1545899857267: Reader PID(11288) - releasing sources
1545899857278: Reader PID(11288) - waiting for semaphore
1545899857323: Writer PID(11620) - releasing sources
1545899857323: Reader PID(2400) - reading page: 0
1545899857334: Writer PID(11620) - waiting for semaphore
1545899857334: Writer PID(11620) - writing page: 3
1545899857455: Writer PID(13224) - releasing sources
1545899857456: Reader PID(14024) - reading page: 4
1545899857466: Writer PID(13224) - waiting for semaphore
1545899857496: Reader PID(2328) - releasing sources
1545899857497: Writer PID(13224) - writing page: 1
1545899857507: Reader PID(2328) - waiting for semaphore
1545899857803: Writer PID(13512) - waiting for semaphore
1545899857892: Reader PID(2400) - releasing sources
1545899857893: Writer PID(13512) - writing page: 0
1545899857903: Reader PID(2400) - waiting for semaphore
1545899858066: Writer PID(13224) - releasing sources
1545899858067: Reader PID(8024) - reading page: 1
1545899858077: Writer PID(13224) - waiting for semaphore
1545899858135: Reader PID(16260) - releasing sources
1545899858136: Writer PID(13224) - writing page: 2
1545899858146: Reader PID(16260) - exiting
1545899858329: Writer PID(8104) - releasing sources
1545899858330: Reader PID(11288) - reading page: 5
1545899858340: Writer PID(8104) - exiting
1545899858378: Reader PID(14024) - releasing sources
1545899858389: Reader PID(14024) - waiting for semaphore
1545899858524: Writer PID(948) - waiting for semaphore
1545899858524: Writer PID(948) - writing page: 4
1545899858727: Writer PID(11620) - releasing sources
1545899858727: Reader PID(2328) - reading page: 3
1545899858738: Writer PID(11620) - exiting
1545899858815: Writer PID(13512) - releasing sources
1545899858815: Reader PID(2400) - reading page: 0
1545899858826: Writer PID(13512) - waiting for semaphore
1545899858900: Reader PID(11288) - releasing sources
1545899858900: Writer PID(13512) - writing page: 5
1545899858911: Reader PID(11288) - waiting for semaphore
1545899859258: Reader PID(9204) - waiting for semaphore
1545899859446: Writer PID(948) - releasing sources
1545899859446: Reader PID(14024) - reading page: 4
1545899859457: Writer PID(948) - waiting for semaphore
1545899859459: Reader PID(8024) - releasing sources
1545899859460: Writer PID(948) - writing page: 1
1545899859470: Writer PID(13512) - releasing sources
1545899859471: Reader PID(8024) - exiting
1545899859471: Reader PID(11288) - reading page: 5
1545899859482: Writer PID(13512) - waiting for semaphore
1545899859529: Writer PID(13224) - releasing sources
1545899859529: Reader PID(9204) - reading page: 2
1545899859540: Writer PID(13224) - exiting
1545899859851: Reader PID(6196) - waiting for semaphore
1545899860017: Reader PID(14024) - releasing sources
1545899860017: Writer PID(13512) - writing page: 4
1545899860028: Reader PID(14024) - waiting for semaphore
1545899860030: Writer PID(948) - releasing sources
1545899860030: Reader PID(6196) - reading page: 1
1545899860041: Writer PID(948) - waiting for semaphore
1545899860121: Reader PID(2328) - releasing sources
1545899860121: Writer PID(948) - writing page: 3
1545899860132: Reader PID(2328) - exiting
1545899860208: Reader PID(2400) - releasing sources
1545899860219: Reader PID(2400) - exiting
1545899860422: Writer PID(16136) - waiting for semaphore
1545899860422: Writer PID(16136) - writing page: 0
1545899860451: Reader PID(9204) - releasing sources
1545899860462: Reader PID(9204) - waiting for semaphore
1545899860862: Writer PID(3464) - waiting for semaphore
1545899860862: Writer PID(3464) - writing page: 2
1545899860864: Reader PID(11288) - releasing sources
1545899860875: Reader PID(11288) - exiting
1545899860952: Reader PID(6196) - releasing sources
1545899860963: Reader PID(6196) - waiting for semaphore
1545899861344: Writer PID(16136) - releasing sources
1545899861345: Reader PID(14024) - reading page: 0
1545899861355: Writer PID(16136) - waiting for semaphore
1545899861356: Writer PID(16136) - writing page: 1
1545899861410: Writer PID(13512) - releasing sources
1545899861411: Reader PID(9204) - reading page: 4
1545899861419: Reader PID(10584) - waiting for semaphore
1545899861421: Writer PID(13512) - exiting
1545899861514: Writer PID(948) - releasing sources
1545899861515: Reader PID(6196) - reading page: 3
1545899861525: Writer PID(948) - exiting
1545899861784: Writer PID(3464) - releasing sources
1545899861785: Reader PID(10584) - reading page: 2
1545899861795: Writer PID(3464) - waiting for semaphore
1545899861796: Writer PID(3464) - writing page: 5
1545899861926: Writer PID(16136) - releasing sources
1545899861937: Writer PID(16136) - waiting for semaphore
1545899861981: Reader PID(9204) - releasing sources
1545899861981: Writer PID(16136) - writing page: 1
1545899861992: Reader PID(9204) - waiting for semaphore
1545899861992: Reader PID(9204) - reading page: 4
1545899862084: Reader PID(6196) - releasing sources
1545899862095: Reader PID(6196) - waiting for semaphore
1545899862365: Writer PID(3464) - releasing sources
1545899862366: Reader PID(6196) - reading page: 3
1545899862376: Writer PID(3464) - waiting for semaphore
1545899862377: Writer PID(3464) - writing page: 5
1545899862707: Reader PID(10584) - releasing sources
1545899862718: Reader PID(10584) - waiting for semaphore
1545899862738: Reader PID(14024) - releasing sources
1545899862749: Reader PID(14024) - exiting
1545899863374: Writer PID(16136) - releasing sources
1545899863375: Reader PID(10584) - reading page: 0
1545899863384: Reader PID(9204) - releasing sources
1545899863385: Writer PID(16136) - exiting
1545899863395: Reader PID(9204) - exiting
1545899863759: Reader PID(6196) - releasing sources
1545899863770: Writer PID(3464) - releasing sources
1545899863779: Reader PID(6196) - exiting
1545899863781: Writer PID(3464) - exiting
1545899863945: Reader PID(10584) - releasing sources
1545899863956: Reader PID(10584) - waiting for semaphore
1545899863956: Reader PID(10584) - reading page: 0
1545899865349: Reader PID(10584) - releasing sources
1545899865360: Reader PID(10584) - exiting
Вывод: WinApi предоставляет возможность для синхронизации доступа к совместно используемой памяти посредством объектов типа семафоры и мьютексы, обеспечивая ограниченный или персональный доступ к ресурсам.
Задание 6.2. Использование именованных каналов для реализации сетевого межпроцессного взаимодействия.
Оба процесса имеют открытые дескрипторы на объект типа File, который является именованным каналом.
Вывод: WinApi предоставляет возможность создания и использования именованных каналов для межпроцессного взаимодействия между локальными процессами и процессами в сети.
Текст программы 6.1
Dispatcher main.cpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <Windows.h>
int main() {
const int N = 6;
const int processN = 9;
const int pageSize = 4096;
HANDLE hFile = CreateFile("fileMapping",
GENERIC_ALL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
SetFilePointer(hFile, pageSize*N, 0, FILE_BEGIN);
SetEndOfFile(hFile);
if (hFile != INVALID_HANDLE_VALUE) {
HANDLE hFileMapping = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
"MappedFile");
if (hFileMapping != INVALID_HANDLE_VALUE) {
HANDLE writeSemaphore = CreateSemaphore(NULL,
N,
N,
"WriteSemaphore");
HANDLE readSemaphore = CreateSemaphore(NULL,
0,
N,
"ReadSemaphore");
HANDLE loggerMutex = CreateMutex(NULL, FALSE, "loggerMutex");
HANDLE IO_Mutex[N];
std::stringstream name;
for (int i = 0;i < N;i++) {
name<<"IO_Mutex"<<i;
IO_Mutex[i] = CreateMutex(NULL,
FALSE, name.str().c_str());
}
HANDLE hChildProcess[2 * processN];
HANDLE hThreadChild[2 * processN];
std::fstream logger;
logger.open("log.txt", std::fstream::app | std::fstream::out);
logger << "==============================================================\n";
logger.flush();
logger.close();
for (int i = 0;i < processN;i++) {
STARTUPINFOA si;
ZeroMemory(&si, sizeof(STARTUPINFOA));
si.cb = sizeof(STARTUPINFOA);
PROCESS_INFORMATION pi;
if (CreateProcess("..\\Debug\\Writer.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
std::cout << "Writer" << i << " started\n";
hChildProcess[i] = pi.hProcess;
hThreadChild[i] = pi.hThread;
}
for (int i = 0;i < processN;i++) {
STARTUPINFOA si;
ZeroMemory(&si, sizeof(STARTUPINFOA));
si.cb = sizeof(STARTUPINFOA);
PROCESS_INFORMATION pi;
if(CreateProcess("..\\Debug\\Reader.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
std::cout << "Reader" << i << " started\n";
hChildProcess[i+processN] = pi.hProcess;
hThreadChild[i +processN] = pi.hThread;
}
WaitForMultipleObjects(2 * processN, hChildProcess, TRUE, INFINITE);
std::cout << "All process are done\n";
std::cin.get();
for (int i = N;i < 2 * N;i++) {
CloseHandle(hThreadChild[i]);
CloseHandle(hChildProcess[i]);
}
for (int i = 0;i < N;i++) {
CloseHandle(IO_Mutex[i]);
}
CloseHandle(writeSemaphore);
CloseHandle(readSemaphore);
CloseHandle(hFileMapping);
}
else {
std::cout << "Can't create file mapping object\n";
std::cin.get();
}
CloseHandle(hFile);
}
else {
std::cout << "Can't create file for mapping\n";
std::cin.get();
}
return 0;
}
Writer main.cpp
#include <iostream>
#include <sstream>
#include <fstream>
#include <Windows.h>
#include <random>
#include <ctime>
#include <chrono>
int main() {
const int N = 6;
const int pageSize = 4096;
srand(time(NULL));
HANDLE hMappedFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "MappedFile");\
std::fstream logger;
logger.open("log.txt", std::fstream::app | std::fstream::out);
logger.rdbuf()->pubsetbuf(NULL, 0);
if (hMappedFile != INVALID_HANDLE_VALUE) {
void* address = MapViewOfFile(hMappedFile, FILE_MAP_READ, 0, 0, 0);
HANDLE writeSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "WriteSemaphore");
HANDLE readSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "ReadSemaphore");
HANDLE loggerMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "loggerMutex");
HANDLE IO_Mutex[N];
std::stringstream name;
for (int i = 0;i < N;i++) {
name << "IO_Mutex" << i;
IO_Mutex[i] = OpenMutex(MUTEX_ALL_ACCESS,
FALSE, name.str().c_str());
}
int ProccessId = GetCurrentProcessId();
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Writer PID(" << ProccessId << ") - started\n";
logger.flush();
ReleaseMutex(loggerMutex);
VirtualLock(address, pageSize*N);
for (int i = 0; i < 3; i++) {
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Writer PID(" << ProccessId << ") - waiting for semaphore\n";
logger.flush();
ReleaseMutex(loggerMutex);
WaitForSingleObject(writeSemaphore, INFINITE);
int index = WaitForMultipleObjects(N, IO_Mutex, FALSE, INFINITE);
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Writer PID(" << ProccessId << ") - writing page: " << index << "\n";
logger.flush();
ReleaseMutex(loggerMutex);
unsigned int pause = (rand() % 1000) + 500;
Sleep((DWORD)pause);
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Writer PID(" << ProccessId << ") - releasing sources\n";
logger.flush();
ReleaseMutex(loggerMutex);
ReleaseMutex(IO_Mutex[index]);
ReleaseSemaphore(readSemaphore, 1, NULL);
Sleep(10);
}
VirtualUnlock(address, pageSize*N);
for (int i = 0; i < N; i++) {
CloseHandle(IO_Mutex[i]);
}
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Writer PID(" << ProccessId << ") - exiting\n";
logger.flush();
ReleaseMutex(loggerMutex);
CloseHandle(loggerMutex);
UnmapViewOfFile(address);
CloseHandle(hMappedFile);
CloseHandle(writeSemaphore);
CloseHandle(readSemaphore);
}
else {
logger << "Cant't open mapped file\n";
}
logger.close();
return 0;
}
Reader main.cpp
#include <iostream>
#include <sstream>
#include <fstream>
#include <Windows.h>
#include <random>
#include <chrono>
int main() {
const int N = 6;
const int pageSize = 4096;
srand(time(NULL));
HANDLE hMappedFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "MappedFile");
std::fstream logger;
logger.open("log.txt", std::fstream::app | std::fstream::out);
logger.rdbuf()->pubsetbuf(NULL, 0);
if (hMappedFile != INVALID_HANDLE_VALUE) {
void* address = MapViewOfFile(hMappedFile, FILE_MAP_READ, 0, 0, 0);
HANDLE writeSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "WriteSemaphore");
HANDLE readSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "ReadSemaphore");
HANDLE loggerMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "loggerMutex");
HANDLE IO_Mutex[N];
std::stringstream name;
for (int i = 0;i < N;i++) {
name << "IO_Mutex" << i;
IO_Mutex[i] = OpenMutex(MUTEX_ALL_ACCESS,
FALSE, name.str().c_str());
}
int ProccessId = GetCurrentProcessId();
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Reader PID(" << ProccessId << ") - started\n";
logger.flush();
ReleaseMutex(loggerMutex);
VirtualLock(address, pageSize*N);
for (int i = 0; i < 3; i++) {
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Reader PID(" << ProccessId << ") - waiting for semaphore\n";
logger.flush();
ReleaseMutex(loggerMutex);
WaitForSingleObject(readSemaphore, INFINITE);
int index = WaitForMultipleObjects(N, IO_Mutex, FALSE, INFINITE);
WaitForSingleObject(loggerMutex, INFINITE);
logger <<std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Reader PID(" << ProccessId << ") - reading page: " << index << "\n";
logger.flush();
ReleaseMutex(loggerMutex);
unsigned int pause = (rand() % 1000) + 500;
Sleep((DWORD)pause);
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Reader PID(" << ProccessId << ") - releasing sources\n";
logger.flush();
ReleaseMutex(loggerMutex);
ReleaseMutex(IO_Mutex[index]);
ReleaseSemaphore(writeSemaphore, 1, NULL);
Sleep(10);
}
VirtualUnlock(address, pageSize*N);
for (int i = 0; i < N; i++) {
CloseHandle(IO_Mutex[i]);
}
WaitForSingleObject(loggerMutex, INFINITE);
logger << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
<< ": Reader PID(" << ProccessId << ") - exiting\n";
logger.flush();
ReleaseMutex(loggerMutex);
UnmapViewOfFile(address);
CloseHandle(hMappedFile);
CloseHandle(writeSemaphore);
CloseHandle(readSemaphore);
}
else {
logger << "Cant't open mapped file\n";
}
logger.close();
return 0;
}
Текст программы 6.2
Writer main.cpp
#include <iostream>
#include <Windows.h>
int main() {
HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\myPipe",
PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED | WRITE_DAC,
PIPE_TYPE_MESSAGE | PIPE_WAIT,
1,
0,
0,
0,
NULL);
if (hPipe != INVALID_HANDLE_VALUE) {
std::cout << "Pipe was created\n";
if (ConnectNamedPipe(hPipe, NULL)) {
std::cout << "Connected to the pipe\n";
OVERLAPPED overlapped;
overlapped.hEvent = CreateEvent(NULL, true, false, NULL);
overlapped.Offset = 0;
overlapped.OffsetHigh = 0;
char buffer[512];
while (strcmp(buffer, "/E") != 0) {
ZeroMemory(buffer, 0);
std::cout << "Enter message(/E to exit): ";
std::cin >> buffer;
WriteFile(hPipe, buffer, strlen(buffer)+1, NULL, &overlapped);
WaitForSingleObject(overlapped.hEvent, INFINITE);
std::cout << "Written\n";
}
DisconnectNamedPipe(hPipe);
CloseHandle(overlapped.hEvent);
}
else {
std::cout << "Can't connect to pipe\n";
std::cin.get();
}
CloseHandle(hPipe);
}
else {
std::cout << "Can't create pipe\n";
std::cin.get();
}
return 0;
}
Reader main.cpp
#include <iostream>
#include <Windows.h>
int main() {
WaitNamedPipeA("\\\\.\\pipe\\myPipe", NMPWAIT_WAIT_FOREVER);
HANDLE hPipe = CreateFile("\\\\.\\pipe\\myPipe",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (hPipe != INVALID_HANDLE_VALUE) {
std::cout << "Connected to the pipe\n";
OVERLAPPED overlapped;
overlapped.hEvent = CreateEvent(NULL, true, false, NULL);
overlapped.Offset = 0;
overlapped.OffsetHigh = 0;
char buffer[512];
while (strcmp(buffer, "/E") != 0) {
ZeroMemory(buffer, 512);
ReadFile(hPipe, buffer, 512, NULL, &overlapped);
WaitForSingleObject(overlapped.hEvent, INFINITE);
std::cout << buffer << '\n';
}
CloseHandle(overlapped.hEvent);
CloseHandle(hPipe);
}
else {
std::cout << "Can't open pipe\n";
std::cin.get();
}
return 0;
}