printf函数打印(二)—— 缓冲区篇(文件读写再探究)

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

在上一个部分介绍了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、数据缓存的框架

2、刷新策略

3、printf缓冲过程

二、阻止缓冲区刷新的相关案例

 1、原案例:将printf打印的内容输出到文件log.txt

 2、新案例:阻止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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值