Glibc中stdio.c内FILE*代码及&运算符、_IO_2_1_stdin_含义解析
Glibc stdio.c代码片段疑问解答
以下是Glibc源码中stdio.c内的一段代码:
#include "stdio.h" #undef stdin #undef stdout #undef stderr FILE *stdin = (FILE *) &_IO_2_1_stdin_; FILE *stdout = (FILE *) &_IO_2_1_stdout_; FILE *stderr = (FILE *) &_IO_2_1_stderr_;
1. 代码中FILE*行的含义
这三行是在重新绑定C程序的三个标准流全局指针:
FILE*是C标准库定义的文件流结构体指针类型,stdin/stdout/stderr是程序启动时默认打开的三个标准流的入口指针。- 先通过
#undef取消头文件中可能存在的宏定义(避免命名冲突),再把这三个指针指向Glibc内部实现的标准流底层实例。
2. 最后三行中&运算符的作用
这里的&是取地址运算符,用来获取_IO_2_1_stdin_等变量在内存中的地址,再通过(FILE *)强制类型转换后,把这个地址赋值给对应的FILE*指针变量,让stdin等指针能指向底层的流管理结构体。
3. _IO_2_1_stdin_是什么?它是文件吗?
_IO_2_1_stdin_不是磁盘上的物理文件,而是Glibc内部实现的标准输入流管理结构体实例:
- 在Glibc的IO系统中,每个文件流(包括标准流)都需要一个内存结构体来管理缓冲区、关联的操作系统文件描述符、流状态等信息,
_IO_2_1_stdin_就是专门对应标准输入的这个结构体实例,_IO_2_1_stdout_、_IO_2_1_stderr_则分别对应标准输出和标准错误。 - 它对接操作系统的标准输入文件描述符(通常是0),是C程序能通过
stdin操作标准输入的底层支撑。
内容的提问来源于stack exchange,提问作者Lokeshwar Reddy
相关产品推荐
相关产品推荐

