c - stdin 上的 close/fclose 是否保证正确?

标签 c stdio

似乎以下调用会按照您的预期进行(关闭流并且不允许任何进一步的输入 - 流上等待输入的任何内容都会返回错误),但它是否保证在所有编译器/平台上都是正确的?

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/

相关文章:

c - 包括 stdio 和 stddef

c - 通过套接字获取线路

c - 是否有 C 库的存储库?

c++ - MATLAB 和 C/C++。如何在不同的 C/C++ 规范之间进行选择

c - 静态链接库之间共享的地址被视为 32 位而不是 64 位

c - Snow Leopard 上损坏的汇编程序

c++ - 'printf' 与 C++ 中的 'cout'

c - 如何在不使用if函数的情况下重新排列数字?

c - 《Head First C》一书中demo中的一个strstr()和fgets()的问题