如果调用 fclose(0),则关闭标准
If fclose(0) is called, does this close stdin?
如果调用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);
- 将手写循环转换为标准库调用
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 该标准是否说明了例外和不同调用约定的共存
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- C++ 线程时出错,标准::调用:
- 在使用标准向量函数时引发'std::bad_alloc'实例后调用的终止
- 在 MASM 中调用标准库函数
- 从 ASM 调用C++代码中标准库的链接
- 如何查看我从 c++ 标准库中调用了哪些函数?
- 包装标准::线程调用函数
- C 标准的哪一部分涵盖通过空指针调用方法
- C++17标准对在nullptr上调用delete有何规定
- 重定向标准输出时调用 dup2 失败
- 是否可以保证C++标准库容器调用可替换的新功能
- 修复此标准::异步调用
- 生成标准输出仅在 4098 字节输出后调用
- 通过引用查找调用范围的标准引用是什么
- 是否存在标准调用约定
- 通过对dll的标准调用操作字符串的问题
- c++-builder:转换为标准调用类型