Почему Пустой printf позволяет мне продолжить чтение данных из stdin?


Код

while (1)
    {
        keycode = key_hook();
        if (keycode == SPACE || keycode == BKSPACE)
        {
            render_again = 1;
        }
        if (keycode == ESC)
            break;
        if (render_again)
        {
            render_again = 0;
            render(all);
        }
        dprintf(1, "");      //I have no idea why this prevents the program from freezing
    }
    int key_hook()
    {
     char buffer[4];

     read(0, buffer, 4);
     return (*(unsigned int *)buffer);
    }

Итак, этот фрагмент кода обрабатывает перерисовку текста на экране. Некоторые строки текста подчеркиваются или выделяются с помощью termcaps (tputs(tgetstr("us, NULL")......). Все печатается нормально, но после первого перерисовывания текста while, по-видимому, замирает, если не присутствует dprintf/printf. Функция key_hook просто считывает 4 bytes из stdin и преобразует их в int.

1 5

1 ответ:

Когда я в последний раз работал здесь, моя версия key_hook имела цикл однобайтовых чтений. Это было нарушено сигналом тревоги в 1 секунду и логикой того, были ли данные до сих пор ключевым префиксом.

Сигнал тревоги прервал чтение и остановил замораживание