Как перенаправить stderr при запуске * без * перенаправления stdin и stdout?
В Windows я хотел бы использовать CreatePipe и CreateProcess для запуска процесса и захвата текста, записанного в stderr.
Пример кода на MSDN здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
Моя проблема в том, что я хочу перенаправить и захватить STDERR, но оставить STDIN и STDOUT в покое. Пусть они все еще будут связаны с окном консоли дочернего процесса. (Если дочерний процесс является консольным процессом, а не оконным процессом.)
Если я буду следовать примеру кода и установить STARTUPINFO.hStdError для моего дескриптора канала, а для STARTUPINFO.hStdOutput и STARTUPINFO.hStdInput установить значение INVALID_HANDLE_VALUE, то у дочернего процесса INVALID_HANDLE_VALUE будет значение stdin и stdout; все чтения не удаются; все printf никуда не денутся; и окно консоли полностью пустое.
Это вообще возможно?
1 ответ
Это должно работать:
STARTUPINFO.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
STARTUPINFO.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
В качестве альтернативы, если вы не можете предоставить родительскому процессу консоль, вы можете установить hStdOutput и hStdInput в INVALID_HANDLE_VALUE и вызывать через cmd.exe следующим образом:
cmd /c "subprocess.exe > con < con"
Обратите внимание, что SHGetFileInfo
с SHGFI_EXETYPE
скажет вам, является ли исполняемый файл консольным приложением или нет, если вы еще не знаете.