#c
#c
Вопрос:
Я видел фрагмент ниже где-то в Интернете. Следующая программа не выводит «hello-out». Причина, по которой я чувствую, в том, что до того, как он будет фактически сброшен на консоль из буфера,
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
Верна ли моя причина? Если нет, то какова правильная причина?
Комментарии:
1. Это может быть связано
stdout
с перенаправлением в файл или в другое место во времяstderr
перехода на консоль.
Ответ №1:
Вы должны поместить n
в конец строки, чтобы она была сброшена, или использовать fflush
для принудительного удаления.
Ответ №2:
Причина следующего исправления заключается в том, что я знаю, что стандартный вывод по умолчанию буферизуется по строкам, тогда как stderr — нет.
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fflush(stdout);
// sleep(1);
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
Обновление другой способ «исправить» это без изменения исходного кода — использовать, например stdbuf
:
stdbuf -o 0 ./test
который также переключает стандартный вывод в режим без буферизации. Интересно, что если вы укажете
stdbuf -e L ./test
чтобы также сделать stderr линейным буфером, вывод вообще не будет отображаться (пока не будет напечатана первая строка)
Комментарии:
1. Интересно, я не знал об этой
stdbuf
команде, хотя, похоже, это нестандартное расширение glibc.