Я хочу создать программу, которая может создавать процесс для любого произвольного exe-файла, при этом сохраняя stderr и stdout этого exe-файла, т.е. перенаправляя его в мою программу. Последовательность вывода из целевого произвольного файла исполняемого файла ДОЛЖНА БЫТЬ СОХРАНЕНА. т.е. если она отправляет 10 символов в стандартный вывод, затем 10 символов в стандартный вывод, а затем 10 символов обратно в стандартный вывод, моей программе необходимо признать тот факт, что дочерний элемент чередуется между стандартным выводом и стандартным выводом, а не просто рассматривать stderr и стандартный вывод как 2 независимых потока. , Или вот так:
стандартный вывод 10 байтов , стандартный вывод 10 байтов , стандартный вывод 10 байтов , стандартный вывод 3 байта , ....... ..
Я знаю, что стандартный способ перенаправления stdout и stderr - создать 2 анонимных канала и иметь эти 2 канала, унаследованные созданным дочерним процессом. Но проблема в том, что анонимный канал блокирует ввод / вывод. Если я использую 2 потока в родительском, один для чтения stdout ребенка, а другой для чтения stderr ребенка, я не могу сказать, что дочерний процесс чередуется между stdout и stderr, т.е. информация о последовательности, указанная выше, потеряна.
EDIT:
Я пишу прокси для cl.exe, lib.exe и link.exe. Система сборки в комплекте с проектами с открытым исходным кодом Mozilla (NSPR) использует несколько совершенно уникальных способов создания исходных файлов, чтобы сделать их переносимыми на несколько платформ и автоматически определить возможности целевого компилятора (например, autoconf и сценарий configure ). Он динамически генерирует некоторые файлы .h и #define при выполнении команды "make". Он даже вызывает некоторые скрипты Python для вызова cl.exe.
Я понятия не имею, что делает система сборки Mozilla и почему ей нужно использовать некоторые скрипты python для вызова cl.exe (который, очевидно, анализирует stdout / stderr команды cl.exe). Я не хочу тратить время на изучение этого. Но все, что я знаю, это то, что в конце он должен вызывать cl.exe, lib.exe и link.exe, а интерфейсами этих команд должны быть аргументы командной строки, переменные env и stdout / stderr. Поэтому мне нужно написать прокси-файл cl.exe, который вызывает настоящий cl.exe и предоставляет мои собственные аргументы командной строки и возвращает вызывающему абоненту все stderr и stdout настолько прозрачно, насколько это возможно.
Характеристики cl.exe заключаются в том, что он может возвращать сообщения об ошибках в stderr и обычные сообщения в stdout. Я просто хочу прозрачный способ вставить прокси между реальным cl.exe и системой сборки.