如果调用fclose(0),这会关闭stdin吗?

bba*_*zso 12 c c++ stdin posix

如果调用fclose(0),这会关闭stdin吗?

我问这个的原因是由于某种原因,stdin在我的应用程序中被关闭,我无法弄清楚为什么.我检查了fclose(stdin),这不在应用程序中,所以我想知道fclose(0)是否会导致未定义的行为,例如关闭stdin?

如果没有,stdin可能被错误关闭的其他方式是什么?

Naw*_*waz 18

签名fclose是这样的:

int fclose ( FILE * stream );
Run Code Online (Sandbox Code Playgroud)

这意味着,fclose期望一个指向FILE对象的指针.因此,如果你传递0,而不是指针,0将被理解为NULL指针1.如果它的NULL指针,你怎么期望它关闭stdin?它不会关闭.使用fclose(stdin),因为stdin它本身是一个指向FILE对象的指针.

我认为你混淆stdin了文件描述符,它是整数类型,通常表示为fd.它的真正fd的输入流0.所以,如果你想使用fd(而不是FILE*),那么你就使用close<unistd.h>.

#include <unistd.h>
int close(int fildes);
Run Code Online (Sandbox Code Playgroud)

也就是说,close(0)会关闭stdin.

1:看起来有趣的是,如果你已经1意图关闭传递给fclose stdout,你的代码甚至不会编译,你会立即在编译时看到代码的问题.现在问题是,为什么不编译?因为不像0,1不会隐式转换为指针类型.编译器会生成类似的消息"error: invalid conversion from ‘int’ to ‘FILE*’.请在ideone处查看错误和行号.


May*_*ank 6

我认为它会把它当作fclose(NULL); 哪个应该是未定义的并且可能会崩溃.

  • 它有时被定义为崩溃:)来自Mac OS X手册页:fclose()函数不处理NULL参数; 它们会导致分段违规 (3认同)

Mel*_*Mel 6

以下关闭stdin: close(0); fclose(stdin); close(STDIN_FILENO); daemon(0, 0);


R..*_*R.. 5

fclose(0)调用未定义的行为,所以是的,它可以做任何事情,包括关闭stdin.但是如果fclose(0)出现在您的代码中,您会遇到更大的问题.