【发布时间】:2008-11-13 20:00:13
【问题描述】:
似乎以下调用符合您的预期(关闭流并且不允许任何进一步的输入 - 任何等待流上输入的东西都会返回错误),但它是否保证在所有编译器/平台上都是正确的?
close(fileno(stdin));
fclose(stdin);
【问题讨论】:
-
你可以只使用 fclose(stdin),它会在文件句柄上调用 close()。
似乎以下调用符合您的预期(关闭流并且不允许任何进一步的输入 - 任何等待流上输入的东西都会返回错误),但它是否保证在所有编译器/平台上都是正确的?
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。
【讨论】:
不要关闭 fileno(FILE*)。 FILE 是一个缓冲对象。调查其实施并干预其状态会带来所有其他软件模块上类似不当行为的警告和危险。
别这样。
啊。严重地。讨厌。
【讨论】:
在所有可能的操作系统上都不能保证正确。但是,调用 fclose(stdin) 将适用于任何 POSIX 兼容的操作系统以及 Windows 操作系统,因此您目前应该使用几乎所有通用的东西。
如上一个答案以及我的评论所述,无需在文件句柄上调用 close。 fclose() 将为您正确关闭所有内容。
【讨论】: