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
.