如果调用fclose(0),这会关闭stdin吗?
我问这个的原因是由于某种原因,stdin在我的应用程序中被关闭,我无法找出原因。 我检查了fclose(stdin),这不在应用程序中,所以我想知道fclose(0)是否会导致未定义的行为,如关闭stdin?
如果没有,stdin可能被错误关闭的其他方式是什么?
fclose
的签名是这样的:
int fclose ( FILE * stream );
这意味着, fclose
需要一个指向FILE
对象的指针。 因此,如果传递0
而不是指针,则0
将被理解为NULL
指针1 。 如果它的NULL指针,你怎么期望它关闭stdin
? 它不会关闭。 使用fclose(stdin)
,因为stdin
本身是指向FILE
对象的指针。
我认为你将stdin
与文件描述符混淆,文件描述符是整数类型,通常表示为fd
。 确实输入流的fd
为0
。 因此,如果您想使用fd
(而不是FILE*
),那么您将使用close
。
#include int close(int fildes);
也就是说, close(0)
将关闭stdin。
1:有趣的是,如果你已经将1
传递给了fclose,意图关闭stdout
,你的代码甚至都不会编译,你会立即在编译时看到代码的问题。 现在的问题是,为什么不编译? 因为与0
不同, 1
不会隐式转换为指针类型。 编译器会生成类似"error: invalid conversion from 'int' to 'FILE*'
。请在ideone处查看错误和行号。
我认为它将它作为fclose(NULL)
; 哪个应该是未定义的并且可能会崩溃。
以下关闭stdin: close(0);
fclose(stdin);
close(STDIN_FILENO);
daemon(0, 0);
fclose(0)
调用未定义的行为 ,所以是的,它可以做任何事情,包括关闭stdin
。 但是如果你的代码中出现fclose(0)
,你会遇到更大的问题。
需要了解更多c/c++开发分享如果调用fclose(0),这会关闭stdin吗?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如果调用fclose(0),这会关闭stdin吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979435.html