一、缓冲区(Buffer)详解
1. 什么是缓冲区
缓冲区本质就是内存上的一块临时空间 。 操作系统 IO 操作(读写显示器、磁盘、网络)速度很慢,如果程序每输出一个字符就直接调用系统接口,频繁陷入内核态,效率极低。 缓冲区核心作用:合并多次 IO 操作,减少系统调用次数,提升效率。
Linux 下默认打开三类标准流:
-
stdin:标准输入(键盘) -
stdout:标准输出(显示器) -
stderr:标准错误输出
区分重点:stdout 带行缓冲,stderr无缓冲,错误信息可以立刻打印。
2. stdout 行缓冲规则
终端场景下,stdout 使用行缓冲,满足任意条件才刷新缓冲区:
-
遇到换行符
\n; -
程序正常结束;
-
缓冲区空间写满;
-
主动调用
fflush(stdout)强制刷新。
演示代码:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("12345");
sleep(5);
return 0;
}
运行现象:程序暂停 5 秒之后,字符串才一次性打印。 原因:没有换行,数据保存在缓冲区,直到进程退出自动刷新缓冲区。
加上换行:printf("12345\n");,文字立刻输出。
强制刷新写法
printf("12345");
fflush(stdout); // 立刻把缓冲区内容刷到显示器
sleep(5);
3. 补充知识点
缓冲区模式区分:
-
行缓冲 :终端 stdout,遇
\n刷新; -
全缓冲:普通文件,缓冲区写满才刷新;
-
无缓冲:stderr,数据直接输出,不缓存。
二、版本控制工具 Git
1. 版本控制器发展历史
-
早期:人工备份,复制文件夹(
code_v1、code_v2),极其笨重; -
中心化版本工具(SVN):所有代码保存在中心服务器,离线无法提交,单点故障风险;
-
Git(分布式版本控制):2005 年 Linus 为 Linux 内核开发。
分布式:每个人本地都拥有一份完整仓库快照,不依赖单一服务器,支持离线提交。
2. Git 核心概念
-
工作区 (Working Directory):你肉眼看到的代码文件夹;
-
暂存区 (Stage/Index) :临时中转站,
git add将文件放入暂存区; -
本地仓库 (Repository) :
.git隐藏目录,保存所有历史版本快照,git commit将暂存内容存入本地仓库。
简易流转流程: 工作区 →(git add)→ 暂存区 →(git commit)→ 本地仓库
3. 基础命令清单
-
git init初始化仓库,生成隐藏目录.git -
git add [文件名] / git add .将工作区修改加入暂存区 -
git commit -m "提交注释"暂存区内容生成版本快照,保存到本地仓库 -
git status查看当前文件状态(未跟踪 / 已修改 / 在暂存区) -
git log查看历史提交日志
4. Github / Gitee 作用
Github/Gitee 是远程代码托管平台,本质是存放 Git 远程仓库。 作用:
-
代码云端备份;
-
多人协作开发;
-
开源项目交流。
常用远程交互指令:
-
git remote add origin 仓库地址绑定远程仓库 -
git push:本地版本推送至远端 -
git pull:拉取远端最新代码到本地
三、面试常见问题汇总
-
为什么 printf 不带换行不会立刻打印? stdout 在终端是行缓冲,没有
\n,不会触发缓冲区刷新,数据暂存在内存缓冲区;进程退出或者主动 fflush 才会输出。 -
stdout 和 stderr 区别? stdout 行缓冲,用于普通信息;stderr 无缓冲,专门输出报错,保证错误信息即时展示。
-
SVN 和 Git 最核心区别? SVN 是中心化;Git 分布式,本地拥有完整仓库,支持离线提交。
-
git add和git commit分别干了什么?git add:文件从工作区移动到暂存区;git commit:把暂存区内所有改动打包,生成永久版本存入本地仓库。