前言
本文深入探讨 Linux 系统中用户缓冲区的概念与工作原理。通过分析 C 语言文件接口(printf、fprintf、fwrite)与系统调用接口(write)的区别,揭示缓冲区在文件 IO 中的重要作用。
一、核心概念
1.1 两种缓冲区
Linux 系统中存在两个层面的缓冲区:
| 类型 | 位置 | 归属 | 刷新机制 |
|---|---|---|---|
| 用户缓冲区 | 用户空间 | C 语言库 FILE 结构体 | 由库函数控制 |
| 内核缓冲区 | 内核空间 | 操作系统 | 由 OS 控制 |
1.2 接口对比
// C 语言库函数接口
printf("hello printf\n");
fprintf(stdout, "hello fprintf\n");
fwrite(str, len, 1, stdout);
// 系统调用接口
write(1, str, len);
关键区别:
- C 库函数先写入用户缓冲区,再由底层调用 write 刷新到内核
- write 系统调用直接写入内核缓冲区,无用户缓冲区
1.3 返回值差异
size_t ret1 = fwrite(str, len, 1, stdout); // 返回:写入的块数
ssize_t ret2 = write(1, str, len); // 返回:写入的字节数
二、缓冲区刷新策略
2.1 三种刷新模式
| 模式 | 触发条件 | 典型场景 |
|---|---|---|
| 无缓冲 | 立即刷新 | fflush() 函数 |
| 行缓冲 | 遇到\n刷新 | 显示器输出 |
| 全缓冲 | 缓冲区满时刷新 | 普通文件写入 |


