似乎以下调用会按照您的预期进行(关闭流并且不允许任何进一步的输入 - 流上等待输入的任何内容都会返回错误),但它是否保证在所有编译器/平台上都是正确的?
close(fileno(stdin));
fclose(stdin);
最佳答案
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
。
关于c - stdin 上的 close/fclose 是否保证正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/288062/