Является ли close / fclose on stdin гарантией правильности?

Кажется, что следующие вызовы делают то, что вы ожидаете (закройте stream и не позволяйте вводить какие-либо дополнительные данные – все, что ожидает ввода в streamе, возвратит ошибку), но гарантировано ли это, что все ошибки будут выполнены во всех компиляторах / платформах?

close(fileno(stdin)); fclose(stdin); 

Ничто не гарантируется в любой операционной системе. Однако вызов fclose (stdin) будет работать с любой операционной системой, совместимой с POSIX, а также с операционными системами Windows, поэтому на данный момент вы должны использовать почти все, что обычно используется.

Как указано в предыдущем ответе, так же как и в моем комментарии, нет необходимости называть close в дескрипторе файла. fclose () будет правильно закрывать все для вас.

fclose(stdin) вызывает дальнейшее использование stdin (неявное или явное) для вызова неопределенного поведения, что очень плохо . Он не «блокирует ввод».

close(fileno(stdin)) вызывает дальнейшие попытки ввода из stdin после того, как текущий буфер был исчерпан, сбой с EBADF , но только до тех пор, пока вы не откроете другой файл, и в этом случае этот файл станет fd # 0 и плохие вещи произойдет .

Более надежный подход может быть:

 int fd = open("/dev/null", O_WRONLY); dup2(fd, 0); close(fd); 

с несколькими дополнительными проверками ошибок. Это гарантирует, что все чтения (после истощения текущего буфера) приведут к ошибкам. Если вы просто хотите, чтобы они привели к EOF, а не к ошибке, используйте O_RDONLY вместо O_WRONLY .

НЕ СОБИРАЙТЕСЬ на fileno (FILE *). FILE – это буферный объект. Изучение его реализации и вмешательство в его состояние несет все предостережения и опасности, которые могут возникнуть с аналогичным неправильным поведением на любом другом программном модуле.

Не делай этого.

AGH. Шутки в сторону. Насти.