перенаправленный STDOUT без завершения EOL покоится в буфере и не отображается - PullRequest
0 голосов
/ 22 апреля 2020

Я пишу программу (интерфейс командной строки), которая перенаправляет 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.

...