stdin上的close / fclose是否保证是正确的?
似乎以下调用执行您期望的操作(关闭流并且不允许任何进一步的输入 – 在流上等待输入的任何内容都会返回错误),但是它是否保证在所有编译器/平台上都是正确的?
close(fileno(stdin)); fclose(stdin);
在每个可能的操作系统中都没有保证正确。 但是,调用fclose(stdin)将适用于任何符合POSIX标准的操作系统以及Windows操作系统,因此您现在应该可以使用几乎任何常用的东西。
正如前面的答案以及我的评论所述,没有必要在文件句柄上调用close。 fclose()将为您正确关闭所有内容。
fclose(stdin)
导致进一步使用stdin
(隐式或显式)来调用未定义的行为,这是一件非常糟糕的事情 。 它不会“抑制输入”。
close(fileno(stdin))
在当前缓冲区耗尽后导致close(fileno(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。 认真。 讨厌。