Я пишу программу (интерфейс командной строки), которая перенаправляет stdout и stdin произвольных программ командной строки. Проблема не зависит от платформы. Чтобы понять проблему, я написал простую программу командной строки, в которой возникает проблема:
#include <stdio.h>
main () {
char Expression[200];
printf ("Enter first expression: "); scanf ("%s", Expression);
printf ("You have entered: %s\n", Expression);
printf ("\n");
printf ("(Now query with Stderr)\n");
fprintf (stderr, "Enter second expression: "); scanf ("%s", Expression);
printf ("You have entered: %s\n", Expression);
}
Вывод «Введите первое выражение» находится в буфере вывода и не отправляется через перенаправленный канал stdout в мою программу. , Итак, первый вопрос - «Введите второе выражение», потому что проблема с буфером возникает только с stdout, а не с stderr. Содержимое буфера (первый запрос) отправляется, если пользователь набрал ввод и нажал RETURN. Таким образом, stdout проходит через канал только после EOL, stderr немедленно показывает вывод.
Если вы запустите Info-Zip UNZIP и распаковываете файлы, которые уже существуют, UNZIP отправляет запрос:
replace myfile.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename:
и этот запрос отправляется через stderr, поэтому проблема не возникает. Но другие программы сталкиваются с проблемой.
Интерфейс командной строки Windows 10 был переписан. Если возникает такая ситуация (например, с помощью встроенной команды cmd.exe «копировать» при перезаписи существующего файла), новый интерфейс командной строки ждет 3 секунды (!), А затем показывает буферизованный запрос. Таким образом, кажется, что программисты Microsoft должны написать «грязный хак», чтобы решить эту проблему.
Мой вопрос: Как заставить пользовательскую программу выплевывать буфер stdout, если EOL не получено? У меня есть полный доступ к сеансу, где пользовательская программа запускается специальной вспомогательной программой в том же сеансе, которая обеспечивает связь между моей программой графического интерфейса и текстовым окном, в котором запускается cmd.exe.