- 博客(74)
- 收藏
- 关注
原创 【Linux 系统篇(二十九)】文件(六):动静态库制作
如果你每次写 C 语言程序,都要自己实现一遍printfmallocstrlen……那该多痛苦?现实中,每个程序都要依赖大量底层的、成熟的、可复用的代码。如果每个人都从零开始写,那软件开发根本不可能有今天的规模。库(Library),就是这些“写好的、现成的、可以复用的代码”的集合。库就是一堆.o目标文件打包在一起形成的二进制文件。它不需要包含main函数(因为它是给别人用的,不是自己跑的),可以被操作系统加载到内存中执行。类型Linux 后缀Windows 后缀链接时机静态库.a.lib。
2026-10-14 16:42:35
131
1
原创 【Linux 系统篇(二十八)】文件(五):Ext 系列文件系统(下):Ext2块组结构,inode与文件寻址原理
有了 dentry 缓存,打开文件时,内核优先在 dentry 缓存树里检索路径,找到直接拿到 inode;缓存不存在,才去磁盘读取目录,生成新 dentry 加入缓存。考点:Q:磁盘上有没有真实的“目录树”?A:没有。磁盘只保存一个个独立文件(属性+数据),目录树是内核在内存里面,通过dentry结构体构建出来的逻辑树。Q:每次打开文件,都要从根目录开始读磁盘解析路径吗?A:逻辑上是从根目录解析,但内核会缓存已经访问过的目录项(dentry),优先在内存缓存查找,缓存命中就不用读磁盘。
2026-10-11 14:19:32
963
18
原创 【Linux 系统篇(二十七)】文件(四):Ext 系列文件系统(上):从物理磁盘到逻辑抽象
inode(索引节点):专门存储文件属性元数据的磁盘数据结构一个文件对应唯一一个 inode;每个 inode 拥有全局唯一 inode 编号;Ext2/Ext3 默认 128字节,Ext4 支持 256字节;无论文件大小,inode 占用磁盘大小固定不变。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-10-07 17:09:46
694
16
原创 【Linux 系统篇(二十六)】文件(三): 深入理解 “一切皆文件”、缓冲区
如果你有 Windows 的使用经验,你会发现“文件”就是硬盘上的 txt、exe、图片。但在 Linux 系统中,这个概念被无限扩大了。Windows 中的文件,在 Linux 中当然也是文件。Windows 中不是文件的东西,比如进程、磁盘、显示器、键盘等硬件设备,在 Linux 中通通被抽象成了文件。甚至在网络编程中使用的 Socket(套接字),以及用于进程间通信的管道(Pipe),本质上也是文件。这样做的好处是什么?一套 API 走天下。
2026-10-07 17:08:40
769
5
原创 【Linux 系统篇(二十五)】文件(二) 系统文件I/O详解
默认打开 0、1、2。新打开的 fd 是当前未被使用的最小下标。关闭一个 fd 后,它的下标可以被重新分配。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-09-26 16:54:34
1143
21
原创 【Linux 系统篇(二十四)】文件(一) 理解文件基础IO
我们分两个层次来看。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-09-26 11:41:35
344
13
原创 【Linux 系统篇(二十三)】进程(十一) 自定义Shell 解释器
你每天都在用 Shell:敲 、、、……但你是否想过,Shell 到底是怎么工作的?为什么 能改变当前目录?为什么 能把输出写到文件?为什么 能打印环境变量?自己动手写一个 Shell,是理解 Linux 进程、文件描述符、环境变量、内建命令等核心概念的最佳途径。Shell 是用户和操作系统之间的“翻译官”。你输入命令,Shell 解析后,要么自己执行(内建命令),要么创建一个子进程去执行(外部命令)。Shell 本身是一个进程,它执行外部命令时,会创建一个子进程,在子进程中运行目标程序。 会创建一
2026-09-23 14:40:37
82
5
原创 【Linux 系统篇(二十二)】进程(十):进程程序替换 exec函数族
因为exec会覆盖原进程的所有代码和数据,如果直接在主进程调用exec,主进程的后续代码就不会执行了。子进程去执行新程序;父进程继续做自己的事情(比如等待子进程、处理其他逻辑)。// 子进程exit(1);} else// 父进程printf("子进程执行完毕\n");原型示例说明带e,需要自己组装环境变量。execle不带p,所以第一个参数必须写全路径,如/bin/ps。envp是一个以NULL结尾的字符串数组,每个字符串形如KEY=VALUE。原型示例说明。
2026-09-19 19:44:09
433
12
原创 【Linux 系统篇(二十一)】进程(九):进程等待 wait/waitpid、status状态参数
如果子进程已经退出,调用waitwaitpid会立即返回,释放资源,获得退出信息。如果子进程还在运行,父进程可能阻塞。如果不存在目标子进程,立即出错返回。父进程调用waitwaitpid后,如果条件不满足,就挂起自己,不继续执行,直到条件满足。父进程调用waitpid并设置WNOHANG,如果子进程还没退出,函数立即返回0,父进程可以继续做别的事,过一会儿再来检查。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-09-18 20:12:32
380
4
原创 【Linux 系统篇(二十)】进程(八):进程创建、进程退出
进程fork 返回值含义子进程0表示这是子进程父进程> 0返回子进程 pid出错-1创建失败,设置errnoexit(1);// 子进程代码} else {// 父进程代码退出码也叫退出状态。它告诉我们最后一次执行的命令是成功还是失败。0:成功。非0:失败,或者被信号终止。echo $?查看上一个前台进程的退出码。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-09-13 15:25:22
524
12
原创 【Linux 系统篇(十九)】进程(七):深入理解虚拟地址空间:从进程地址空间到内核管理
为了更好地理解虚拟地址空间,我们先讲一个生动的比喻——大富翁的私生子有一个身价 10 亿的大富翁,他有 4 个私生子,彼此互不相识,都以为自己是独生子。富翁对每个孩子都画了大饼说:“儿子,我这 10 亿资产未来全是你的!” 于是每个儿子都认为自己拥有 10 亿。当私生子 A 想要10 万的零花钱,富翁随手给了;私生子 B 想要 100 万买个车,富翁也满足了……但实际上,富翁手里总共只有 10 亿,他通过自己的账本管理着给每个儿子的实际资源,而不是真的让每个儿子都占有全部资产。大富翁= 操作系统(OS)
2026-09-09 20:24:31
922
15
原创 【Linux 系统篇(十八)】进程(六) :环境变量
i=1注意:等号两边不能有空格;如果值包含空格,需要用双引号或单引号包裹。什么是环境变量?环境变量是操作系统中用来指定运行环境的一些参数,以NAME=value形式存储,具有全局属性,可被子进程继承。常见环境变量有哪些?PATH(命令搜索路径)、HOME(用户主目录)、SHELL(当前 Shell)、USER(当前用户)、PWD(当前目录)等。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-09-07 12:00:41
692
19
原创 【Linux 系统篇(十七)】进程(五) :进程切换、O(1) 调度算法
用户级上下文:进程的虚拟地址空间,包括代码段、数据段、用户栈、共享库等。寄存器级上下文(硬件上下文):CPU 中各寄存器在某一瞬间的值,它精确描述了 CPU 当前“正在做什么、做到哪一步了”。系统级上下文:操作系统管理该进程所需的数据结构,比如进程控制块(PCB /)、页表、打开的文件描述符表、内核栈、信号处理状态等。在进程切换时,操作系统主要保存和恢复的是寄存器级上下文。
2026-09-05 13:51:56
1205
15
原创 【Linux 系统篇(十六)】进程(四) : 僵尸进程、孤儿进程、进程优先级
想象你正走在路上,一个人突然从你身边跑过,却脚下一滑,摔倒在地,猝死了。虽然他已经没有了生命体征,但因为死因不明,他的遗体和随身物品(对应子进程的、退出码和信号)必须原封不动地保留在原地,任何人不得擅自收尸。这个“等待验尸、尸体尚未处理”的阶段,就是 Linux 中的僵尸状态。你马上报警,警察赶到现场:拍照、登记身份信息、查明死因(对应父进程调用waitpid获取子进程的退出信息)。一切登记完毕,警察才挥手让救护车把遗体拉走,此时才真正进入死亡状态(X 状态),所有相关资源()被释放。
2026-09-02 17:23:15
2124
9
原创 【Linux 系统篇(十五)】进程 (三) :进程状态深度详解
要弄明白“正在运行的进程”到底指什么,我们必须先看内核源码如何定义进程状态。在 Linux 内核中,进程有时也被称为“任务”(task),其状态定义在等头文件中。/**/这个状态数组实际上是一个“位图”(bitmap),不同状态对应不同的位。R状态的值是0,其他状态分别是,它们都是 2 的幂次方,意味着每个状态占用一个独立的二进制位。内核可以用简单的位测试来判断一个进程是否处于某些状态的组合。我们日常使用ps命令看到的进程状态字符,就是内核根据这个数组映射出来的。进程的 PCB(
2026-08-13 14:52:01
623
23
原创 【Linux 系统篇(十四)】进程 (二) :PCB、task_struct、fork系统调用
进程就是正在运行的程序,或者说是“程序的执行实例”。这个说法很直观,但不够精确。资源分配的基本单位:操作系统会把 CPU 时间、内存、I/O 设备等资源分配给进程。调度的基本单位:CPU 到底去运行哪一个进程,是按照进程为单位来切换的。用更现代一点的视角来看,进程可以拆成两部分:进程 = 内核为该进程维护的数据结构(PCB) + 进程自己的代码和数据这里的数据结构在 Linux 中就是,我们马上会详细讲它。代码和数据则是指:可执行文件里的机器指令,以及程序运行时用到的全局变量、堆、栈等。
2026-08-09 15:32:46
739
24
原创 【Linux 系统篇(十三)】进程 (一) :冯诺依曼体系结构、操作系统
任何一台完整的计算机系统里,都包含一套最基本的程序集合,它叫做操作系统(Operating System,OS)。内核(Kernel):操作系统的核心,直接掌管硬件,负责进程管理、内存管理、文件系统、设备驱动、网络协议栈等关键模块。内核工作在最高特权级,可以执行任何指令。外壳程序与工具集:比如命令行解释器(shell)、图形界面、各种基础函数库等。它们不是内核,但为用户和程序员提供了与内核交互的便捷途径。我们常用的 Linux、Windows、macOS,最本质的区别就体现在内核的设计与实现上。
2026-08-04 17:07:53
1737
20
原创 【Linux 系统篇(十二)】基础开发工具(七) —— 调试器 gdb/cgdb使用
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-08-03 17:05:12
662
16
原创 【Linux 系统篇(十一)】基础开发工具(六) —— 版本控制器 Git
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-08-02 11:06:55
508
12
原创 【Linux 系统篇(十)】基础开发工具(五) —— 第一个系统程序 - 进度条
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-29 15:47:53
829
11
原创 【Linux 系统篇(九)】基础开发工具(四) —— 自动化构建 make/Makefile
Makefile 中可以用变量名=值来定义变量,引用时用$(变量名)或${变量名}。例如:这样修改编译器或输出文件名时,只改变量定义即可。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-27 13:02:29
929
8
原创 【Linux 系统篇(八)】基础开发工具(三) —— 编译器 GCC/G++ 完全指南
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-25 13:57:49
970
13
原创 【Linux 系统篇(七)】基础开发工具(二) —— vim编辑器详解
替换模式:按Shift + r(即大写R)进入,输入的字符会覆盖光标位置的原有内容,而不是插入。适合修正小段文字。可视模式:按v进入字符选择,按V进入行选择,按Ctrl + v进入列块选择(矩形区域)。选定后可以批量删除、复制、缩进等。命令模式常用指令速记类别命令含义移动hjkl左 下 上 右单词wbe下一词首、上一词首、词尾行内0绝对行首、行首文字、行尾文件ggGnG文件头、文件尾、第 n 行翻页向前/后页,向前/后半页插入iaoIAO光标前/后/下行/行首/行尾/上行插入删除xX。
2026-07-23 19:46:10
1726
19
原创 【Linux 系统篇(六)】基础开发工具(一) —— 软件安装完全指南
如果你准备自己组装一台电脑。这时你需要买来 CPU、主板、内存、硬盘等各种零件,对着说明书一步步安装——这就是 Linux 下源码编译安装软件的原始方式:下载程序的源代码,然后执行配置、编译、安装等步骤,最终得到可执行程序。这种方式虽然灵活,但对使用者要求很高。为了让安装软件变得简单,一些热心的社区维护者和大神们,提前把常用的软件编译好,并且按照一定的规范打包成一个“压缩包”,这个压缩包不仅包含编译好的程序文件,还记录了软件的版本、依赖关系、安装路径等信息。这样一个封装好的整体,就叫做软件包。
2026-07-22 14:22:03
1101
14
原创 【Linux 系统篇(五)】权限详解(二)
大多数 Linux 发行版中,root 的默认 umask 是0022,而普通用户的默认 umask 是0002。区别就在于 owner(文件拥有者)的那个位上:普通用户 umask 的 owner 部分是 0,因此不会屏蔽自己的任何权限。但对 group 和 other 来说,依然屏蔽了写权限。root umask 0022 -> 文件 644,目录 755普通用户 umask 0002 ->文件 664,目录 775今天的内容到这里就结束了,希望你能有所收获~
2026-07-21 16:54:14
676
7
原创 【Linux 系统篇(三)】入门基础指令详解(三)
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-18 18:07:08
698
6
原创 【Linux 系统篇(二)】入门基础指令详解(二)
编号名称含义默认指向0标准输入程序的输入数据来源键盘1标准输出程序正常输出的目的地终端屏幕2标准错误程序错误信息的输出地终端屏幕也就是说,当你在程序里printf打印内容时,这些内容其实是写入了文件描述符 1;报错信息则写入文件描述符 2。而“重定向”就是改变这些数据流的方向,让输出不显示在屏幕上,而是存到文件里。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-17 15:50:43
811
7
原创 【Linux 系统篇(一)】入门基础指令详解(一)
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-16 11:52:25
920
12
原创 【C++11篇(六)】智能指针保姆级讲解!
智能指针默认用delete释放资源。但如果你管理的不是单个newnew[]分配的数组fopen打开的文件其他需要特殊释放的资源(如 socket、锁等)直接交给默认删除器会导致崩溃(例如对new[]调用delete而非delete[]这时就需要自定义删除器。内存泄漏是指程序中已动态分配的内存,由于丢失了指向它的所有指针,再也没有机会释放。比如我们最开始的例子,忘记delete或在异常时跳过了delete。对于短期运行。
2026-07-11 20:25:05
785
20
原创 【C++11篇(五)】异常处理完全指南
exception今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-09 17:32:04
689
13
原创 【C++11篇(四)】新的类功能、lambda 与包装器详解
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-08 10:31:12
812
10
原创 【C++11篇(三)】可变参数模版详解
让函数模板和类模板可以接受任意数量、任意类型的参数。以前我们只能为每种参数个数写一个重载,现在一个模板就能搞定。这里Args就是一个模板参数包,可以代表 0 个或多个模板类型参数;而args是函数参数包,对应着 0 个或多个函数参数。和普通模板参数不一样,参数包前面有省略号...。表示Args是一组类型的集合(可以没有,也可以有很多)。则是一组值的集合。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-07-06 20:04:03
549
9
原创 【C++11篇(二)】右值引用、移动语义保姆级讲解!
左值能取到地址、有名字、有持久状态的表达式。比如定义的变量、解引用的指针、数组的元素等等。左值可以出现在赋值号左边,也可以出现在右边。// p 是左值int b = 1;// b 是左值// c 是 const 左值(不能修改,但可以取地址)*p = 10;// *p 是左值s[0] = 'x';// s[0] 是左值// 都可以取地址左值的英文是 lvalue,传统上认为是 left value;现代 C++ 更倾向于解释为(有存储位置的值)。可以取地址。右值。
2026-07-04 16:40:45
614
14
原创 【C++11篇(一)】发展历程、列表初始化详解
为了让讲解更加清晰,我们先把需要用到的Dateclass Datepublic:private:int _year;int _month;int _day;这个类很简单:一个三参数构造函数(每个参数都有默认值),一个拷贝构造函数,并且它们都会在调用时输出信息,方便我们追踪构造过程。这行代码是如何工作的?编译器看到,会尝试用这三个值去构造一个Date对象。先被用来构造一个Date类型的临时对象,也就是调用构造函数。这个临时对象再作为参数去拷贝构造d1,即调用。
2026-06-22 07:40:56
807
18
原创 【C++ STL篇(十五)】哈希表封装 unordered_map 和 unordered_set
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-06-18 13:52:27
1355
18
原创 【C++ STL篇(十四)】哈希表实现:开放定址法与链地址法
这体现了 C++ 模版的灵活性——只要提供一个能将 Key 转为整数的仿函数,任何类型都能作为哈希表的 Key。今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-06-02 17:41:19
2021
46
原创 【C++ STL篇(十三)】无序关联容器 unordered_set / unordered_map解析
因为之前已经详细讲解过 map和set 所以本文对一些重复度较高的部分就没有过多赘述,有需要的小伙伴可以看看博主往期的文章。꜀(˘꒳˘ ꜀)【C++ STL篇(八)】set容器——零基础入门与核心用法精讲【C++ STL篇(九)】map容器——零基础入门与核心用法精讲【C++ STL篇(十二)】红黑树の影分身:一棵树如何同时化身 map 和 set(万字拆解+源码)今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-05-29 17:46:48
2175
38
原创 【C++ STL篇(十二)】红黑树の影分身:一棵树如何同时化身 map 和 set(万字拆解+源码)
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-05-26 16:19:43
1379
31
原创 【C++ STL篇(十一)】深入浅出红黑树:从原理到实现,一篇搞定
今天的内容到这里就结束了,希望你能有所收获~干货整理到手抖,觉得有用的话,赏个三连回回血?
2026-05-23 18:16:40
1449
30
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅