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

2024-01-10

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

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stdin 上的 close/fclose 是否保证正确? 的相关文章

随机推荐