Добавил:
github.com Кофедра ВТ-помойка Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тимофеев 2018 / ОС 6 лаб

.docx
Скачиваний:
33
Добавлен:
26.01.2019
Размер:
490.84 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ВТ

отчет

по лабораторной работе № 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;

}

Соседние файлы в папке Тимофеев 2018