程序运行的时候,会自动打开三个文件,分别是stdin、stdout、stderr
这三个文件对应的外设分别是 键盘、显示器、显示器
这三个文件对应的文件描述符为 0、1、2
printf函数在显示器上打印数据是如何实现的??
一、通过write函数理解打印的过程
我们要打印数据,本质上就是向 fd = 1指向的文件输送数据(因为默认情况下 fd = 1指向的文件是显示器文件)
所以我们 通过write函数向fd = 1 写入数据 -----> 向显示器文件写入数据
二、关闭 fd = 1,测试 printf 函数是否打印
fd = 1 字符打印到显示器上
测试代码
测试结果
显示器上没有打印字符,但是字符被写入到 log.txt 文件当中了。
open函数:建立 struct files 和 文件结构体 之间的联系
close函数:断开 struct files 和 文件结构体 之间的联系
三、原因分析
printf函数的功能:在显示器上打印指定的内容,向显示器文件stdout中写入内容
首先,我们看看这里所谓的stdout到底是什么?!
stdout 的类型是File*,也就是对应文件结构体File的地址
每个文件结构体FILE中必定包含 封装好的文件描述符(如下)
typedef struct _IO_FILE FILE; //在usr/include/stdio.h
struct _IO_FILE
{
//其他的先不考虑...
//...
int _fileno; //封装的文件描述符
}
原因解释
stdout对应的结构体 中封装好的文件描述符 fd = 1
printf函数要打印内容那就去找stdout,stdout对应的结构体中封装好的文件描述符 fd = 1,通过fd = 1定位到对应的文件结构体地址,然后向这个文件输送内容。
下标为1对应的文件替换成了其他文件log.txt
这就是printf打印的过程,只认stdout里包含的fd,即只认识下标,不管这个下标指向哪。