当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《stdin上的close/fclose是否保证是正确的?》经验,为你挑选了2个好方法。

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

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.



1> R....:

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.



2> Sniggerfardi..:

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

不要这样做.

AGH.认真.讨厌.


事实上,如果有任何未完成的数据要刷新,那么在fclose()之前执行close()可以保证fclose()失败.(在更一般的情况下,可能是close()和fclose()之间的其他代码,fclose()可能只是写入错误的文件!)
推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有