#include "EvryThng.h"
int _tmain(int argc, LPTSTR argv[])
/* Соединение двух команд с помощью канала в командной строке: pipe команда1 = команда2 */
{
DWORD i = 0;
HANDLE hReadPipe, hWritePipe;
TCHAR Command1[MAX_PATH];
SECURITY_ATTRIBUTES PipeSA = /* Для наследуемых дескрипторов. */
{sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
PROCESS_INFORMATION ProcInfo1, ProcInfo2;
STARTUPINFO StartInfoCh1, StartInfoCh2;
LPTSTR targv = SkipArg(GetCommandLine);
GetStartupInfo(&StartInfoCh1);
GetStartupInfo(&StartInfoCh2);
/* Найти символ "=", разделяющий две команды. */
while (*targv != '=' && *targv != '\0') {
Command1[i] = *targv;
targv++;
i++;
}
Command1[i] = '\0';
/* Пропуск до начала второй команды. */
targv = SkipArg(targv);
CreatePipe(&hReadPipe, &hWritePipe, &PipeSA, 0);
/* Перенаправить стандартный вывод и создать первый процесс. */
StartInfoCh1.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
StartInfoCh1.hStdError = GetStdHandle(STD_ERROR_HANDLE);
StartInfoCh1.hStdOutput = hWritePipe;
StartInfoCh1.dwFlags = STARTF_USESTDHANDLES;
CreateProcess(NULL, (LPTSTR)Command1, NULL, NULL, TRUE /* Унаследовать дескрипторы. */, 0, NULL, NULL, &StartInfoCh1, &ProcInfo1);
CloseHandle(ProcInfo1.hThread);
/* Закрыть дескриптор записи канала, поскольку он больше не нужен, чтобы вторая команда могла обнаружить конец файла. */
CloseHandle(hWritePipe);
StartInfoCh2.hStdInput = hReadPipe;
StartInfoCh2.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
StartInfoCh2.hStdError = GetStdHandle(STD_ERROR_HANDLE);
StartInfoCh2.dwFlags = STARTF_USESTDHANDLES;
CreateProcess(NULL, (LPTSTR)targv, NULL, NULL, TRUE, 0, NULL, NULL, &StartInfoCh2, &ProcInfo2);
CloseHandle(ProcInfo2.hThread);
CloseHandle(hReadPipe);
/* Ожидать завершения первого и второго процессов. */
WaitForSingleObject(ProcInfo1.hProcess, INFINITE);
CloseHandle(ProcInfo1.hProcess);
WaitForSingleObject(ProcInfo2.hProcess, INFINITE);
CloseHandle(ProcInfo2.hProcess);
return 0;
}
Именованные каналы
Именованные каналы (named pipes) предлагают ряд возможностей, которые делают их полезными в качестве универсального механизма реализации приложений на основе IPC, включая приложения, требующие сетевого доступа к файлам, и клиент-серверные системы[31], хотя для реализации простых вариантов IPC, ориентированных на байтовые потоки, как в предыдущем примере, в котором взаимодействие процессов ограничивается рамками одной системы, анонимных каналов вам будет вполне достаточно. К числу упомянутых возможностей (часть которых обеспечивается дополнительно) относятся следующие:
• Именованные каналы ориентированы на обмен сообщениями, поэтому процесс, выполняющий чтение, может считывать сообщения переменной длины именно в том виде, в каком они были посланы процессом, выполняющим запись.
• Именованные каналы являются двунаправленными, что позволяет осуществлять обмен сообщениями между двумя процессами посредством единственного канала.