Стандарт C99 не определяет, являются ли три стандартных потока небуферизованными или буферизованными: Это зависит от реализации. Все известные мне реализации UNIX имеют буферизованную строку stdin
.В Linux stdout
в строке с буферизацией и stderr
без буферизации.
Насколько я знаю, POSIX не накладывает дополнительных ограничений.Страница POSIX fflush в разделе ПРИМЕРЫ отмечает:
[...] Функция fflush () используется, поскольку стандартный вывод обычно буферизуется иприглашение не может быть сразу напечатано на выходе или терминале.
Таким образом, добавленное вами замечание fflush(stdout);
является правильным.
Альтернативой может быть stdout
небуферизованный:
setbuf(stdout, NULL);
/* or */
setvbuf(stdout, NULL, _IONBF, 0);
Но, как отмечает Р., вы можете сделать это только один раз, и это должно быть до того, как вы напишите в stdout
или выполните любое другое действие на нем.(C99 7.19.5.5 2)
Я только что прочитал недавнюю ветку на comp.lang.c
об одном и том же.Одно из замечаний:
Соглашение Unix заключается в том, что stdin
и stdout
буферизуются строкой, когда связаны с терминалом, и полностью буферизуются (иначе говоря, блочная буферизация) в противном случае.stderr
всегда небуферизован.