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_v1code_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 addgit commit 分别干了什么? git add:文件从工作区移动到暂存区; git commit:把暂存区内所有改动打包,生成永久版本存入本地仓库。

相关推荐
blueSatchel8 分钟前
ros-humble仿真-建图-导航
linux·ros2
Lucis__12 分钟前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
程序员-Benothing34 分钟前
Shell 脚本条件判断与流程控制:if for while case 详解
linux·运维·服务器
mounter62536 分钟前
统一安全域:KVM Planes 如何驾驭硬件特权级
linux·安全·linux kernel·kernel
君生我老1 小时前
Linux动静态库
linux·服务器
宵时待雨1 小时前
linux笔记归纳19:网络层协议IP
linux·网络·笔记·网络协议·tcp/ip
颜颜yan_2 小时前
Git Cola 鸿蒙 PC 版适配全记录:从 Qt 桌面工具到 ArkTS 原生应用
git·qt·harmonyos
做运维的阿瑞2 小时前
Linux下DNS服务器搭建
linux·运维·服务器
团子股股东峥哥2 小时前
day37-RHEL-管理基本存储
linux·运维·服务器
君生我老2 小时前
Linux inode概念 &软硬连接
linux·服务器