Режим ожидания и сброс вывода

#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.