C++ 如果调用fclose(0),是否关闭stdin?
如果调用fclose(0),是否关闭stdin 我之所以问这个问题,是因为出于某种原因,stdin在我的应用程序中被关闭了,我不知道为什么。我检查了fclose(stdin),但这不在应用程序中,因此我想知道fclose(0)是否会导致未定义的行为,例如关闭stdinC++ 如果调用fclose(0),是否关闭stdin?,c++,c,posix,stdin,C++,C,Posix,Stdin,如果调用fclose(0),是否关闭stdin 我之所以问这个问题,是因为出于某种原因,stdin在我的应用程序中被关闭了,我不知道为什么。我检查了fclose(stdin),但这不在应用程序中,因此我想知道fclose(0)是否会导致未定义的行为,例如关闭stdin 如果没有,还有哪些方式会导致stdin错误关闭?我认为它会将其视为fclose(NULL);它应该是未定义的,并且可能会崩溃。以下关闭标准: close(0) fclose(标准输入法) 关闭(标准文件号) 守护进程(0,0)fc
如果没有,还有哪些方式会导致stdin错误关闭?我认为它会将其视为
fclose(NULL)
;它应该是未定义的,并且可能会崩溃。以下关闭标准:
close(0)代码>
fclose(标准输入法)代码>
关闭(标准文件号)代码>
守护进程(0,0)代码>fclose的签名如下:
int fclose ( FILE * stream );
这意味着,fclose
需要指向FILE
对象的指针。因此,如果传递0
,而不是指针,0
将被理解为NULL
pointer1。如果它的指针为空,您希望它如何关闭stdin
?它不会关闭。使用fclose(stdin)
,因为stdin
本身是指向文件
对象的指针
我认为你把stdin
与文件描述符混淆了,文件描述符是整型的,通常表示为fd
。输入流的fd
确实是0
。因此,如果您想使用fd
(而不是FILE*
),那么您必须使用
中的关闭
#包括
int close(int fildes);
也就是说,close(0)
将关闭stdin
1:有趣的是,如果您将1
传递给fclose并打算关闭stdout
,您的代码甚至不会编译,并且您会在编译时立即看到代码本身的问题。现在的问题是,为什么它不编译?因为与0
不同,1
未隐式转换为指针类型。编译器将生成如下消息:错误:从“int”到“FILE*”的转换无效。
。请查看错误和行号。fclose(0)
调用未定义的行为,因此是的,它可以执行任何操作,包括关闭stdin
。但是如果fclose(0),问题会更大
出现在您的代码中。文件号(stdin)= 0,但STDIN!=0,您是否需要关闭STDIN的错误方法?那么,我们大多数人现在都在做这件事:-您确定它在您的应用程序中关闭而不是在您的应用程序之前关闭吗?<代码> STDIN <代码>在程序的一个运行开始时正确工作,然后在运行的中间停止工作?如果没有,也许程序TH至少调用了已关闭(或从未设置)的stdin。它可能与Mac OS X手册页中定义的崩溃:)重复:fclose()函数不处理空参数;它们将导致分段violation@Nawaz但是使用fclose(stdin)安全吗
?它是否产生任何未定义的行为?如中所示,它与调用close(0)
?@Djack:1)是。2)否。3)否有任何不同。
#include <unistd.h>
int close(int fildes);