Linux下C语言缓冲区原理 + Git版本控制

一、缓冲区(Buffer)详解

1. 什么是缓冲区

缓冲区本质就是内存上的一块临时空间 。 操作系统 IO 操作(读写显示器、磁盘、网络)速度很慢,如果程序每输出一个字符就直接调用系统接口,频繁陷入内核态,效率极低。 缓冲区核心作用:合并多次 IO 操作,减少系统调用次数,提升效率。

Linux 下默认打开三类标准流:

  • stdin:标准输入(键盘)

  • stdout:标准输出(显示器)

  • stderr:标准错误输出

区分重点:stdout 带行缓冲,stderr无缓冲,错误信息可以立刻打印。

2. stdout 行缓冲规则

终端场景下,stdout 使用行缓冲,满足任意条件才刷新缓冲区:

  1. 遇到换行符 \n;

  2. 程序正常结束;

  3. 缓冲区空间写满;

  4. 主动调用 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. 版本控制器发展历史

  1. 早期:人工备份,复制文件夹(code_v1、code_v2),极其笨重;

  2. 中心化版本工具(SVN):所有代码保存在中心服务器,离线无法提交,单点故障风险;

  3. Git(分布式版本控制):2005 年 Linus 为 Linux 内核开发。

分布式:每个人本地都拥有一份完整仓库快照,不依赖单一服务器,支持离线提交。

2. Git 核心概念

  • 工作区 (Working Directory):你肉眼看到的代码文件夹;

  • 暂存区 (Stage/Index) :临时中转站,git add 将文件放入暂存区;

  • 本地仓库 (Repository) :.git 隐藏目录,保存所有历史版本快照,git commit 将暂存内容存入本地仓库。

简易流转流程: 工作区 →(git add)→ 暂存区 →(git commit)→ 本地仓库

3. 基础命令清单

  1. git init 初始化仓库,生成隐藏目录 .git

  2. git add [文件名] / git add . 将工作区修改加入暂存区

  3. git commit -m "提交注释" 暂存区内容生成版本快照,保存到本地仓库

  4. git status 查看当前文件状态(未跟踪 / 已修改 / 在暂存区)

  5. git log 查看历史提交日志

4. Github / Gitee 作用

Github/Gitee 是远程代码托管平台,本质是存放 Git 远程仓库。 作用:

  1. 代码云端备份;

  2. 多人协作开发;

  3. 开源项目交流。

常用远程交互指令:

  • git remote add origin 仓库地址 绑定远程仓库

  • git push:本地版本推送至远端

  • git pull:拉取远端最新代码到本地

三、面试常见问题汇总

  1. 为什么 printf 不带换行不会立刻打印? stdout 在终端是行缓冲,没有\n,不会触发缓冲区刷新,数据暂存在内存缓冲区;进程退出或者主动 fflush 才会输出。

  2. stdout 和 stderr 区别? stdout 行缓冲,用于普通信息;stderr 无缓冲,专门输出报错,保证错误信息即时展示。

  3. SVN 和 Git 最核心区别? SVN 是中心化;Git 分布式,本地拥有完整仓库,支持离线提交。

  4. git add 和 git commit 分别干了什么? git add:文件从工作区移动到暂存区; git commit:把暂存区内所有改动打包,生成永久版本存入本地仓库。

相关推荐
殷色玫瑰31 分钟前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
忆挽篱笙歌1 小时前
gcc,g++
linux
Code_Solitude1 小时前
C语言:关于二维数组的作业总结
java·c语言·前端
l1t2 小时前
修复WSL CreateInstance/E_UNEXPECTED和 mounted read-only 错误
linux·windows·wsl
Ruiery2 小时前
Linux 6.6内核 CPU 深度解析(九):时钟与 TSC — 内核怎么从 PIT/HPET 切到 TSC
linux·运维·服务器
挖掘狂人2 小时前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
老花眼猫2 小时前
数学艺术图案画-曼陀罗(93)
c语言·经验分享·青少年编程·课程设计
91刘仁德2 小时前
Linux网络编程从入门到实战:UDP/TCP协议与socket编程全解析
linux·网络·笔记·tcp/ip·udp
水饺编程3 小时前
第1章:下载 Linux 0.12 内核
linux·c语言·汇编·ubuntu
牢姐与蒯3 小时前
一点小碎片——每个线程独有的东西——上下文+栈
linux·运维·服务器