printf(3)
является частью стандартной библиотеки ввода-вывода C, которая выполняет внутреннюю буферизацию для повышения производительности.
Существует три типа буферизации: нет, строка и блок.
Какая буферизация применяется, частично определяется тем, является ли дескриптор для записи 2
или нет, и подключен ли он к терминалу. (См. isatty(3)
.)
Если печать выполняется в stderr (2
), то буферизация не выполняется.
Если печать выполняется на любом другом дескрипторе, то поведение меняется, если это терминал или нет: если выходной сигнал - терминал, то на выходе будет строка с буферизацией . Если вывод не терминал (файл, канал, сокет и т. Д.), Тогда вывод будет с буферизацией блока .
Когда строка буферизована, она ждет \n
, прежде чем что-либо печатать. (Или если вы напишите достаточно, чтобы переполнить внутренние буферы перед отправкой \n
.)
Вместо этого я бы порекомендовал следующее:
printf("->:");
fflush(stdout);
read(STDIN_FILENO, buf, sizeof(buf));
/* ... */
printf("%s\n", buf);
Это небольшое изменение; вы не получите бессмысленную пустую строку при запуске программы, и подсказка должна появиться .. быстро.
Вы можете использовать функцию setvbuf(3)
, чтобы изменить буферизацию для вашего потока один раз, при запуске, и вам больше не придется очищать его снова, если вы предпочитаете.
int err = setvbuf(stdout, NULL, _IONBF, 0);
/* check err */