10

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

close(fileno(stdin));
fclose(stdin);
4

3 回答 3

27

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.

于 2011-05-08T04:23:22.390 回答
14

不要关闭 fileno(FILE*)。FILE 是一个缓冲对象。调查其实施并干预其状态会带来所有其他软件模块上类似不当行为的警告和危险。

不要这样做。

啊。严重地。讨厌。

于 2008-11-13T20:05:23.247 回答
3

在所有可能的操作系统中,没有任何东西可以保证正确。但是,调用 fclose(stdin) 将适用于任何符合 POSIX 的操作系统以及 Windows 操作系统,因此您现在应该使用几乎所有通用的东西。

正如前面的答案以及我的评论所述,无需在文件句柄上调用 close 。fclose() 将为您正确关闭所有内容。

于 2008-11-13T20:08:25.703 回答