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

时间:2011-05-10 14:35:35

标签: c++ c posix stdin

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

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

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

4 个答案:

答案 0 :(得分:18)

fclose的签名是这样的:

int fclose ( FILE * stream );

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

我认为你将stdin与文件描述符混淆,文件描述符是整数类型,通常表示为fd。确实输入流的fd0。因此,如果您想使用fd(而不是FILE*),那么您必须使用close中的<unistd.h>

#include <unistd.h>
int close(int fildes);

也就是说,close(0)将关闭标准输入。

<子> 1:有趣的是,如果你已经将1传递给fclose并意图关闭stdout,那么你的代码甚至不会编译,你会立即在编译时看到代码的问题本身。现在问题是,为什么不编译?因为与0不同,1不会隐式转换为指针类型。编译器将生成类似"error: invalid conversion from ‘int’ to ‘FILE*’的消息。请参阅错误和行号here at ideone

答案 1 :(得分:6)

我认为它会将其视为fclose(NULL);哪个应该是未定义的并且可能会崩溃。

答案 2 :(得分:6)

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

答案 3 :(得分:5)

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