Создание дочернего процесса с перенаправленным StdOut и StdErr - PullRequest
1 голос
/ 17 октября 2011

Я хочу создать программу, которая может создавать процесс для любого произвольного 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 и системой сборки.

1 Ответ

1 голос
/ 17 октября 2011

Я не уверен, почему вы хотите это сделать, но то, что вы просили, можно сделать так:

У вас есть поток на поток, оба потока совместно используют общую очередь или что-то еще, как только они читают байт из потока, они получают блокировку и помещают какой-то объект в общую очередь. Даже это не гарантирует правильности, но я думаю, что этого будет достаточно.

Этот подход будет иметь огромные накладные расходы, потому что он будет создавать объект на каждый прочитанный байт. В зависимости от того, что вы ожидаете в качестве вывода, возможно, ожидание всей строки будет иметь больше смысла.

Возможно, вы захотите расширить свой вопрос более подробной информацией о том, чего вы пытаетесь достичь?

РЕДАКТИРОВАТЬ: Почему бы вам просто не вывести stdout ребенка и std err к своему собственному?

...