Функции потокового ввода-вывода, такие как scanf
, обычно выполняют буферизацию для повышения производительности.Таким образом, если вы вызовете scanf
на стандартном вводе, то он, вероятно, будет читать больше символов, чем необходимо для удовлетворения запроса, и дополнительный будет ждать, буферизованный, для следующего чтения.
ЗаменаБазовый дескриптор файла не влияет на ранее буферизованные данные.Когда вы впоследствии снова прочитаете файл, вы получите данные, буферизованные в первый раз, пока они не будут исчерпаны, и только тогда вы получите свежие данные из нового базового файла.
Если вы хотите, вы можете отключить буферизациюпоток через функцию setvbuf()
перед выполнением каких-либо операций ввода-вывода:
int result = setvbuf(stdin, NULL, _IONBF, 0);
if (result != 0) {
// handle error ...
}
На самом деле это очень упрощенная версия более сложной программы с использованием fork / execструктура, которая начала вести себя очень плохо.Несмотря на отсутствие циклов, он каким-то образом начал порождать бесконечных детей в бесконечном цикле.
Я не понимаю, как это поведение будет связано с тем, что вы здесь спросили.
Итак, если позволяют правила, мне, вероятно, придется расширить вопрос более конкретным случаем использования.
Это был бы отдельный вопрос.