如果调用fclose(0),这是否关闭标准?
我问这个问题的原因是,由于某种原因,stdin 在我的应用程序中被关闭了,我不知道为什么。 我检查了 fclose (stdin),但这不在应用程序中,所以我想知道 fclose(0) 是否会导致未定义的行为,例如关闭标准?
如果不是,还有什么其他方式可以错误地关闭 stdin?
fclose
的签名是这样的:
int fclose ( FILE * stream );
这意味着,fclose
需要一个指向FILE
对象的指针。因此,如果您传递 0
而不是指针,0
将被理解为指针1 NULL
。如果它的 NULL 指针,您希望它如何关闭stdin
?它不会关闭。 使用 fclose(stdin)
,因为stdin
本身是指向FILE
对象的指针。
我认为您将stdin
与整体类型的文件描述符混淆了,通常表示为 fd
.输入流的fd
确实是0
.因此,如果您想使用fd
(而不是FILE*
),那么您必须使用<unistd.h>
中的close
。
#include <unistd.h>
int close(int fildes);
也就是说,close(0)
会关闭标准。
1 : 有趣的是,如果你通过1
来关闭stdout
,你的代码甚至不会编译,你会在编译时立即看到你的代码本身的问题。现在的问题是,为什么它不编译?因为与0
不同,1
不是隐式转换为指针类型。编译器将生成类似 "error: invalid conversion from ‘int’ to ‘FILE*’
的消息。请参阅此处的错误和行号。
fclose(0)
调用未定义的行为,所以是的,它可以做任何事情,包括关闭stdin
。但是,如果fclose(0)
出现在代码中,则会遇到更大的问题。
我认为它会把它当作fclose(NULL)
;这应该是未定义的,可能会崩溃。
以下内容关闭标准: close(0);
fclose(stdin);
close(STDIN_FILENO);
daemon(0, 0);