在上一个部分介绍了printf函数打印的完整过程
简单说就是 printf打印只知道要找 stdout,stdout包含的文件描述符 fd = 1
然后printf就去找 fd = 1对应的文件结构体,将数据写入到这个文件中
那么问题来了,在这个寻文件然后写文件的过程中,数据放在哪里??
===》答案是C缓冲区!
在用户层,每个文件有一个C缓冲区来存放数据(其实可以看作是一个数组);在内核层,也有对应的内核缓冲区来存放数据。每个文件的文件结构体中还有对应的属性来维护缓冲区
//在用户层,文件的表现形式是FILE结构体
struct FILE
{
int _fileno; //文件描述符
char* _IO_read_ptr; //维护缓冲区的相关内容
char* _IO_read_end;
char* _IO_read_base;
}
目录
1、原案例:将printf打印的内容输出到文件log.txt
一、数据缓存
1、数据缓存的框架
下面这个框架是计算机系统的局部
语言层 —— 我们平时书写代码用的 C/C++、java
OS —— 操作系统

2、刷新策略
我们要想在显示器上打印数据,那就必须要把C缓冲区中的数据刷新到内核缓冲区,然后再通过OS写入到硬件
刷新主要分下面三种:
(1) 不刷新(不缓冲)
(2) 行刷新(行缓冲): 遇到\n时,直接刷新到内核缓冲区
(3) 缓冲区满了,才刷新(全缓冲),比如向磁盘文件中写入
3、printf缓冲过程
一开始printf会将数据存入 I/O缓冲区,由于是行缓冲,行缓冲的特点是 遇到 \n 时会立马将C缓冲区的内容刷新到内核缓冲区
printf("hello, world\n");

二、阻止缓冲区刷新的相关案例
1、原案例:将printf打印的内容输出到文件log.txt
在上一部分介绍printf的打印过程时,分析过下面的代码

(1) 先关闭 fd = 1,也就是断开fd = 1 和stdout之间的联系

(2) 打开log.txt

本文探讨printf函数如何将数据先存入C缓冲区,随后在行缓冲或全缓冲策略下刷新到内核,分析了阻止缓冲区刷新的案例并提供解决方案。关键在于理解进程间数据传递路径和flush操作对文件写入的影响。
最低0.47元/天 解锁文章
2934





