如果调用fclose(0),这会关闭stdin吗?
我问这个的原因是由于某种原因,stdin在我的应用程序中被关闭,我无法弄清楚原因。我检查了fclose(stdin),这不在应用程序中,所以我想知道fclose(0)是否会导致未定义的行为,如关闭stdin?
如果没有,stdin可能被错误关闭的其他方式是什么?
答案 0 :(得分:18)
fclose
的签名是这样的:
int fclose ( FILE * stream );
这意味着,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);
也就是说,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)
,则会遇到更大的问题。