Нежелательная буферизация при фильтрации вывода консоли в Win32 - PullRequest
1 голос
/ 24 июня 2010

Мой вопрос связан с "Отключить буферизацию в конвейере" хотя и касается Windows, а не Unix.

Я пишу клон Make и не позволяю параллельным процессам перебивать друг друга'консольный вывод Я перенаправил вывод в каналы (как описано в здесь ), по которым я могу выполнить любую фильтрацию, какую захочу.К сожалению, долго выполняющиеся процессы теперь буферизуют свои выходные данные, а не отправляют их в режиме реального времени, как это делается на консоли.

Из-за просмотра источников MSVCRT кажется, что основной причиной является то, что GetFileType () используется дляпроверьте, подключены ли стандартные дескрипторы ввода-вывода к консоли, которая затем устанавливает внутренний флаг и в конечном итоге отключает буферизацию.

Очевидно, отдельный массив наследуемых файловых дескрипторов и флагов также может передаваться через недокументированныйlpReserved2 член STARTUPINFO структурированный при создании процесса.О единственном рабочем решении, которое я выяснил, - это использовать этот список и просто лгать о типе устройства при установке флагов для stdout / stderr.

Теперь, тогда ... Есть ли вменяемый способ решения этой проблемы?

1 Ответ

1 голос
/ 24 июня 2010

Там нет. Да, GetFileType () сообщает, что stdout больше не является символьным устройством, _isatty () возвращает false, поэтому CRT переключает выходной поток в буферный режим. Важно получить разумную пропускную способность. Промывка вывода по одному символу за раз допустима только тогда, когда на них смотрит человек.

Вам придется связать программы, которые вы пытаетесь перенаправить, с настроенной версией CRT. Я не сомневаюсь, что если бы это было возможно, вы бы не пошутили об этом. Исправление GetFileType () - еще одно ненормальное решение.

...