// Программа из конспекта "Системное программное обеспечение" // Анонимные каналы Windows // стр. 51 #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; }