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

时间:2008-11-13 20:00:13

标签: c stdio

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

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

3 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:14)

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

不要这样做。

AGH。认真。讨厌。

答案 2 :(得分:3)

在每个可能的操作系统中都没有任何保证是正确的。但是,调用fclose(stdin)可以在任何符合POSIX标准的操作系统以及Windows操作系统上运行,因此您现在应该可以使用几乎任何常用的东西。

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