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:把暂存区内所有改动打包,生成永久版本存入本地仓库。

相关推荐
来者皆善1 小时前
ZYNQ linux上使用 USB CDC ACM
linux·运维·服务器
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Dawn-bit3 小时前
Linux磁盘分区与Swap和磁盘故障查询
linux·运维·服务器·网络·云计算
2301_777998343 小时前
C/C++:预处理详解
c语言·c++
无足鸟ICT4 小时前
【RHCA+】$[]
linux·运维·服务器
运维技术小记5 小时前
国产化环境配置 VNC 远程桌面:麒麟 V10 实战
linux·运维·服务器
xiaoye-duck5 小时前
《Linux系统编程》Linux 系统多线程(八): C++ 高并发线程池全链路深度解析与从零手撕实现
linux·c++·线程池
寒水馨6 小时前
Linux下载、安装protobuf-v35.1(附安装包protoc-35.1-linux-x86_64.zip)
linux·运维·服务器·google·序列化·protobuf·protoc
ziguo11226 小时前
Windows API MessageBox 函数详解
c语言·c++·windows·visualstudio