如果调用 fclose(0),则关闭标准



如果调用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);

最新更新