似乎以下调用执行您期望的操作(关闭流并且不允许任何进一步的输入 - 在流上等待输入的任何内容都会返回错误),但它是否保证在所有编译器/平台上都是正确的?
close(fileno(stdin)); fclose(stdin);
R.... 21
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
.
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是一个缓冲对象.调查其实施并干预其状态带来了在任何其他软件模块上类似的不当行为所带来的所有警告和危险.
不要这样做.
AGH.认真.讨厌.