код спит в то время как цикл ожидает выхода - PullRequest
3 голосов
/ 21 июня 2011
#include <stdio.h>
#include <unistd.h>
int main()
{
    while(1)
    {
        fprintf(stdout,"hello-out");
        fprintf(stderr,"hello-err");
        sleep(1);
    }
    return 0;
}

Вывод выше на моей машине:

hello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-err

Мне пришлось убить программу, чтобы остановить ее.Это правильное и ожидаемое поведение.Или это неправильно. Это был вопрос для интервью, поэтому я публикую здесь.

Ответы [ 3 ]

8 голосов
/ 21 июня 2011

Это ожидаемый результат:

  • Программа зацикливается навсегда из-за цикла while (1).
  • stdout является буферизованной строкой (по умолчанию), поэтому она сбрасывается на консоль только при печати символа новой строки ('\n'). Поскольку вы не печатаете символы новой строки, вы никогда не увидите текст hello-out.
  • Однако stderr не является буферизованной строкой (по умолчанию), поэтому обновляет консоль при каждом новом вызове fprintf().
5 голосов
/ 21 июня 2011

stdout буферизуется на большинстве машин.Вы не увидите никакого вывода из вызовов fprintf на stdout, если вы не напечатаете новую строку или вызов fflush().

Так что да, в большинстве случаев это ожидаемое поведение.

4 голосов
/ 21 июня 2011

Хотя все правы в том, что у вас есть бесконечный цикл, stderr не буферизуется, поэтому вы получаете его немедленно, stdout является буферизованной строкой, поэтому он откладывается до получения новой строки, но они не упоминают, что stdout не имеет бесконечной памяти. Я думаю, что буферы 1k или около того по умолчанию (см. Setbuf). Если вы будете ждать достаточно долго, вы получите очень длинный набор последовательностей приветствий. Вполне возможно, что последний hello-out может быть обрезан на части пути через строку "hello-out".

[...]hello-outhello-outhellhello-errhello-err
                       ^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...