<stdio.h>标准流stdin、stdout、stderr初始化时机与执行主体问询
标准流及对应
FILE*指针初始化逻辑 首先明确两个层面的初始化流程,二者都发生在exec()调用成功之后、main()函数执行之前:
- 内核层文件描述符初始化:由操作系统内核完成。
exec()执行时,内核会检查进程的0、1、2号文件描述符是否被标记了FD_CLOEXEC关闭标记:如果未标记,直接继承父进程的对应描述符;如果已标记,内核会默认打开当前进程的控制终端作为输入、输出、错误流,绑定到0、1、2号描述符上。这一步完成后仅存在内核态的文件描述符,还没有用户态的FILE*指针。 - 用户态
FILE*指针初始化:由C运行时库(CRT)完成。内核完成进程创建的基础工作后,会先执行C库的启动例程(比如glibc下的__libc_start_main),该例程会在调用main()之前完成stdio子系统的初始化:将已经准备好的0、1、2号文件描述符分别封装为FILE结构体实例,把结构体的地址赋值给stdin、stdout、stderr三个全局指针。
C11标准7.21.3节明确规定,程序启动时三个标准流已经预先打开,无需用户显式调用
fopen,因此你在main()函数的第一行就可以直接使用这三个指针操作标准流,不需要担心未初始化的问题。
内容的提问来源于stack exchange,提问作者DevKhaverko
相关产品推荐
相关产品推荐

