И снова всем привет. На сей раз я пожаловал с каналами.
Задание такое: первый процесс должен пересылать строку во второй процесс по анонимному каналу, а второй - обратно на первый. То бишь, 1 -> 2, 2 -> 1.
Первый процесс переворачивает строку задом наперед, а второй делает ее заглавными буквами. И, вроде как, нужны два канала, т.к. анонимный обеспечивает передачу только в одном направлении.
Но проблема вот в чем: у меня получается своего рода петля. Поскольку используется стандартный ввод-вывод, я понять не могу, куда мне вводить-то, собственно, эту строку.
Код - вот он.
PipeA.cpp
Код:
#include <windows.h>
#include <iostream>
using namespace std;
char szBuf[256];
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
BOOL fSuccess;
int main ()
{
hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
hStdin = GetStdHandle (STD_INPUT_HANDLE);
if ( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) )
ExitProcess(1);
int i, j;
for(;;)
{
fSuccess = ReadFile (hStdin, szBuf, 256, &dwRead, NULL);
if (!fSuccess || dwRead == 0)
break;
for (i = 0, j = dwRead-2; i<j; i++, j--)
{
char c = szBuf[i];
szBuf[i] = szBuf[j];
szBuf[j] = c;
}
fSuccess = WriteFile (hStdout, szBuf, dwRead, &dwWritten, NULL);
if (!fSuccess)
break;
}
ExitProcess (0);
return 0;
}
PipeB.cpp
Код:
#include <windows.h>
#include <iostream>
using namespace std;
char szBuf[256];
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
BOOL fSuccess;
int main ()
{
hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
hStdin = GetStdHandle (STD_INPUT_HANDLE);
if ( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) )
ExitProcess (1);
for (;;)
{
fSuccess = ReadFile (hStdin, szBuf, 256, &dwRead, NULL);
if (!fSuccess || dwRead == 0)
break;
CharUpperBuff (szBuf, strlen (szBuf));
fSuccess = WriteFile (hStdout, szBuf, dwRead, &dwWritten, NULL);
if (!fSuccess)
break;
}
ExitProcess (0);
return 0;
}
Launcher.cpp (создает каналы и запускает сами процессы)
Код:
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
HANDLE hFirstToSecondRead, hFirstToSecondWrite,
hSecondToFirstRead, hSecondToFirstWrite;
HANDLE Proc[2];
int ProcessCount = 0;
int CreatePipeProcess (LPTSTR, HANDLE, HANDLE, DWORD);
int main()
{
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
if ( !CreatePipe (&hFirstToSecondRead, &hFirstToSecondWrite, &saAttr, 512) )
{
cout << "Error while creating first pipe" << endl;
getch();
return 0;
}
if ( !CreatePipe (&hSecondToFirstRead, &hSecondToFirstWrite, &saAttr, 512) )
{
cout << "Error while creating second pipe" << endl;
getch();
return 0;
}
CreatePipeProcess ("PipeA.exe", hSecondToFirstRead, hFirstToSecondRead, CREATE_NEW_CONSOLE);
CreatePipeProcess ("PipeB.exe", hSecondToFirstRead, hFirstToSecondRead, CREATE_NEW_CONSOLE);
DWORD retCode = WaitForMultipleObjects (ProcessCount, Proc, TRUE, INFINITE);
if ( retCode )
{
DWORD errCode = GetLastError();
errCode++;
return errCode--;
}
for (int i = 0; i < ProcessCount; ++i)
CloseHandle (Proc[i]);
CloseHandle (hFirstToSecondRead);
CloseHandle (hFirstToSecondWrite);
CloseHandle (hSecondToFirstRead);
CloseHandle (hSecondToFirstWrite);
return 0;
}
int CreatePipeProcess (LPTSTR name, HANDLE Input, HANDLE Output, DWORD CreationFlag)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory (&si, sizeof(si));
si.hStdInput = Input;
si.hStdError = GetStdHandle (STD_ERROR_HANDLE);
si.hStdOutput = Output;
si.dwFlags = STARTF_USESTDHANDLES;
si.cb = sizeof (si);
ZeroMemory (&pi, sizeof (pi));
if ( !CreateProcess (NULL, name, NULL, NULL, TRUE, CreationFlag, NULL, NULL, &si, &pi) )
{
printf ("Error while starting PipeA.exe\n");
_getch ();
return false;
}
if ( CreationFlag == CREATE_NEW_CONSOLE )
Proc[ProcessCount] = OpenProcess ( PROCESS_ALL_ACCESS, FALSE,
pi.dwProcessId );
else
Proc[ProcessCount] = pi.hProcess;
CloseHandle (pi.hThread);
++ProcessCount;
return true;
}
В общем, хотелось бы каких-нибудь объяснений