- 博客(31)
- 收藏
- 关注
原创 linux进程信号
信号是进程之间进行事件异步通知的一种方式。所谓“异步”,是指信号的产生和进程对信号的处理不必发生在同一时刻。进程可以在正常执行自己的代码时,突然收到一个信号,并根据该信号对应的处理动作作出响应。
2026-11-13 11:23:18
208
原创 进程间通信
一个进程需要将自身数据发送至另一个进程,完成数据交互。:多个进程共用系统同一类资源,避免资源重复分配、浪费。:一个进程向单个或一组进程发送消息,传递状态变更通知,典型场景为子进程退出后通知父进程。:部分进程需要全权管控另一个进程的执行流程、运行状态。:匿名管道、命名管道下文将按上述分类,逐一详细介绍各类进程间通信方式的原理、使用规则、代码实例及核心特点。头文件:#include <unistd.h>:创建无名管道,实现进程间数据传输。
2026-09-21 15:44:23
166
原创 库的制作与原理
gcc main.c -I头文件路径 -L库文件路径 -ltest -o main.o核心特性验证:编译生成 main.o 可执行文件后,删除原始静态库文件,程序依然可以正常运行。这是因为静态库代码已完整拷贝至可执行文件中,运行不再依赖外部库文件。gcc main.c -I头文件路径 -L库文件路径 -ltest -o main.o动态链接本质是将符号查询、地址重定位的工作,从编译时推迟到运行时。
2026-09-17 16:45:23
257
原创 数字世界资源的通用管理者--智能指针
在上一次异常的讲解中的异常安全问题部分我们提到一种情况,当抛出异常导致当前函数域提前退出时,可能会有后续用于释放资源的代码未得到执行,为了避免资源泄露,我们当时提出的解决方案是捕获后作部分资源处理工作然后再重新抛出,交给上层继续处理,但这种方式弊端很明显,为了更为高效地应对类似场景,就出现了智能指针。
2026-09-07 16:35:11
180
原创 C++的异常处理
2. 若异常在 try 代码块内触发,从 try 块开始执行,到 throw 语句触发的整个区间内,所有已经成功构造完成的局部对象,都会被系统自动析构,且析构顺序与对象的构造顺序严格相反,避免出现内存残留问题。3. 若当前函数没有 try/catch 结构,或现有 catch 子句的类型与异常对象不匹配,程序会终止当前函数执行,向上回溯外层函数调用链,逐层查找匹配的 catch 代码块,这个逐层回溯查找的过程就是。补充说明:程序抛出异常对象时,会自动生成该异常对象的拷贝。的catch代码块处理异常。
2026-09-01 16:12:21
362
原创 Ext系列文件系统
文件系统是操作系统的核心机制,主要用于抽象、管理磁盘、固态硬盘等存储设备上的数据。而Ext文件系统是Linux系统中生态覆盖最广、功能支持最完善的文件系统家族,也是Linux系统的主流文件系统。
2026-08-31 16:44:51
354
原创 一起探索C++11的那些变化(下)
C++11 新增可变参数模板特性,支持和实现可变数量参数,彻底解决了传统模板参数个数固定的局限。其中可变数量的参数统称为:代表零个或多个模板类型参数:代表零个或多个函数形参对象可变参数模板的核心语法通过省略号语法核心规则:模板参数列表中,class...或表示后续为零个或多个类型列表;函数参数列表中,类型名后加...表示后续为零个或多个形参列表。可变参数模板的底层原理与普通模板一致,核心是,无需开发者手动重载多参数函数。我们可以通过。
2026-08-11 18:05:37
315
原创 一起探索C++11的那些变化(上)
传统认知:左值=赋值左侧值,右值=赋值右侧值。现代 C++ 精准定义:左值(locator value):可寻址、存储在内存中的对象右值(read value):仅可读取数据、不可寻址的临时对象/常量核心区别:是否可以取地址左值引用、右值引用的唯一区别是初始化绑定阶段左值引用初始化只能绑定左值右值引用初始化只能绑定右值(move转换后的左值等价于右值)初始化完成后,两类引用变量的使用规则完全一致。移动构造函数:参数为当前类的右值引用,额外参数必须带默认值,用于从右值对象掠夺资源,初始化新对象。
2026-08-09 16:18:54
330
原创 基础I/O
缓冲区是内存中预留的一段临时存储空间,用于缓存输入、输出数据。根据数据流向可分为输入缓冲区和输出缓冲区,是衔接高速CPU与低速IO设备的中间层。
2026-08-04 10:00:53
361
原创 进程控制
自定义shell的核心原理:模拟系统shell的执行逻辑,通过获取用户输入、解析命令、区分内建/外部命令、创建子进程替换执行、回收进程资源,实现基础的命令行交互功能。整体遵循固定执行流程,同时维护全局运行变量保障功能稳定。
2026-08-02 16:45:25
309
原创 进程概念
/ 单个CPU的调度队列// 每个优先级(0~139)一个链表,分别指向活动队列和过期队列// 优先级位图:用位运算快速找到最高优先级的非空队列// 140 bits,对应140个优先级// 优先级数组,用于存储不同优先级的进程队列// 该数组中处于运行状态的进程总数// 优先级位图,快速定位非空队列// 140 个优先级队列,每个队列对应一个优先级。
2026-07-21 16:55:54
167
原创 Linux基础开发工具
在Linux系统中安装软件,最原始的方式是下载程序的源代码,然后通过编译操作生成可执行程序。但这个过程十分繁琐,不仅需要配置编译环境,还需要处理各种依赖问题,对新手来说门槛较高。为了简化安装流程,有开发者会将常用的软件提前编译好,打包成软件包(类似于Windows系统上的安装程序),并将这些软件包存放在专用的服务器上。用户通过包管理器,就能快速获取并安装这些编译好的软件包,无需手动编译,极大提升了软件安装的效率。
2026-07-18 17:39:43
201
原创 Linux权限详解
只要用户拥有目录的写权限,无论该用户是否拥有目录内单个文件的读写权限,都可以直接删除该文件,存在极大的文件安全隐患,因此Linux引入了。通过r、w、x对应的数值(4、2、1)累加,分别对应所有者、所属组、其他用户的权限,简洁高效,是最常用的权限配置方式。:新建文件/目录的最终权限 = 基础权限 & ~umask(基础权限减去权限掩码对应的权限)用户标识符:u(所有者)、g(所属组用户)、o(其他用户)、a(所有用户,包含u、g、o)针对目录,可在目录内创建、删除、移动文件或子目录。
2026-06-07 15:30:48
352
原创 AVL树实现
/ 需要parent指针,后续更新平衡因子时可通过父指针向上追溯int _bf;// balance factor,平衡因子// 构造函数{}public: // 后续实现插入、删除、查找等成员函数//...private:// 根节点初始化为空。
2026-05-21 15:26:51
356
原创 map和set的使用
map是键值对(key-value)容器,底层同样由红黑树实现,其模板声明如下:1. Key:map底层关键字的类型,即键的类型,用于唯一标识每个键值对。2. T:map底层value的类型,即值的类型,是关键字对应的关联数据。3. Compare:仿函数,默认实现为小于比较(less<Key>),用于对关键字进行排序;若Key不支持默认比较,或需要自定义排序规则,可自行实现仿函数传入。4. Alloc:空间配置器,用于分配map底层存储键值对的内存,默认使用标准配置器即可。
2026-05-10 21:06:14
371
原创 二叉搜索树
二叉搜索树又称二叉排序树,它可以是一棵空树。当二叉搜索树为非空树时,必须满足如下条件:若左子树不为空,则左子树上的所有节点值都小于等于根节点的值;若右子树不为空,则右子树上的所有节点值都大于等于根节点的值;它的左右子树也分别为二叉搜索树(这意味着上面两条规则对于这棵二叉搜索树是递归成立的);二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体需根据使用场景来定义。
2026-04-21 19:16:06
298
原创 多态(C++)
类成员函数前加virtual修饰就是虚函数。注意:虚函数依赖 this 指针实现多态,因此不能是 static 成员函数,也不能是全局函数,但可以在类外部定义实现。
2026-04-14 20:02:54
519
原创 STL(上)
适配器是一种设计模式,其作用是将一个类的接口转换成客户希望的另外一个接口,使得原本因接口不兼容而无法一起工作的类可以协同工作。deque是一种双开口的“连续”空间的数据结构(这里的“连续”是逻辑上的连续,物理上可能是分段连续的)。双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度均为O(1)。与其他容器对比:与vector比较:deque的头插效率更高,不需要搬移元素;与list比较:deque的空间利用率更高,不需要为每个节点存储额外的指针字段。
2026-04-05 15:25:47
462
原创 C++模板总结
template<class T1, class T2, ..., class Tn> class 类模板名 { // 类内成员(成员变量、成员函数)定义 };分离编译模式是C++程序的常见编译方式:一个程序由若干个源文件(.cpp)共同实现,每个源文件单独编译生成目标文件(.obj),最后将所有目标文件链接起来,形成单一的可执行文件(.exe)。
2026-03-26 17:34:42
496
原创 类和对象(C++)
• class是定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。• 为了区分成员变量和局部变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_ 或者 m开头(例如:_name、m_age),注意C++中这个并不是强制的,只是行业内的一些惯例,目的是提升代码可读性,避免命名冲突。
2026-03-08 16:08:46
666
原创 C++入门基础
如果类内定义的函数不做内联处理,当类被多个`.cpp`文件包含时(通过头文件),每个文件都会生成该函数的一份定义,链接时会报"重复定义"错误(和静态成员变量类内初始化的问题一样)。类内定义函数是"声明/定义分离"的例外,但编译器通过"内联优化"弥补了规则冲突——既保留了"类内写函数"的便捷性(特别是短小的getter/setter),又不破坏编译链接规则。编译器将类内定义的函数标记为inline,既满足"类内定义"的便捷性,又符合"单定义规则(ODR)"。为什么必须从右往左?因为实参是从左往右传给形参的。
2026-02-26 17:30:24
595
原创 C语言贪吃蛇小游戏完整实现
/ 核心符号宏定义(宽字符,前缀L不可省略)#define WALL L'□' // 墙体符号#define BODY L'●' // 蛇身符号#define FOOD L'★' // 食物符号// 蛇初始位置坐标(x=24,y=5,后续蛇身围绕该位置初始化)// 按键检测宏(GameRun函数依赖)
2026-02-25 12:30:38
1012
原创 二叉树理论知识重难点总结
二叉树是特殊的树,不存在度大于2的结点(每个结点最多有2个子结点);二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
2026-02-14 18:07:00
574
原创 单链表经典OJ题算法分析(附代码示例)
深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。核心思路:先统计两个链表的长度,计算长度差,让长链表先遍历长度差步数,使两个链表的遍历起点“对齐”(距离相交节点的步数相同),再同步遍历找相交节点。关键误区:不能通过“节点值”定位 random 指向的节点(链表中可能存在值相同的节点),需建立“原节点与拷贝节点”的唯一关联关系。2. 此时,拷贝节点与原节点的关联关系明确:拷贝节点 = 原节点->next,原节点 = 拷贝节点->next(插入后可快速定位)。
2026-02-08 17:18:44
606
原创 初识编译和链接
C/C++ 程序从源代码到实际运行,需经历「翻译环境」和「运行环境」两个核心阶段,二者分工明确、衔接紧密,确保源代码能转化为可执行指令并正常执行。
2026-02-04 17:34:57
1009
原创 C语言文件操作详解
从物理存储角度来说,硬盘等外存设备上存储的各类数据集合,统称为文件。从功能角度分类,我们日常编程中接触的文件主要分为两类:程序文件和数据文件,以下重点讲解数据文件的相关操作。二者的差异源于存储特性和读取场景的不同,并非函数设计的随意性,遵循以下规则可避免错误:文本文件:fgetc判EOF,fgets判NULL;二进制文件:fread判“实际读取个数 < 要求读取个数”;无论哪种文件,读取结束后,均可通过feof和ferror区分“正常末尾”和“读取错误”。
2026-02-03 18:13:30
611
原创 数据在内存中的存储
计算机以“字节”为基本存储单位,对于长度大于1字节的数据(如int、float、double),需要确定多个字节在内存中的排列顺序,由此产生了大端和小端两种存储模式:大端(存储)模式:数据的低位字节内容,保存在内存的高地址处;数据的高位字节内容,保存在内存的低地址处(符合人类阅读习惯,“高位在前,低位在后”)。小端(存储)模式:数据的低位字节内容,保存在内存的低地址处;数据的高位字节内容,保存在内存的高地址处(符合硬件运算习惯,“低位在前,高位在后”)。
2026-01-31 18:54:45
572
原创 C常见基础库函数介绍其模拟实现
功能:统计参数str指向的字符串长度,仅统计字符串中'\0'之前的字符个数。注意事项:字符串以'\0'作为结束标志,strlen函数返回值为'\0'前面出现的字符个数(不包含'\0'参数指向的字符串必须以'\0'结束,否则统计结果为随机值(行为未定义)。函数返回值为size_t类型(无符号整数),使用时需注意无符号运算的特性(如负数与无符号数比较会出错)。模拟实现。
2026-01-30 19:39:31
597
原创 指针知识点整理
简单来说,指针是用来存储内存地址的变量。内存中每一个字节都有唯一的编号(即地址),指针变量存储的就是这个地址;创建变量的本质是向内存申请一块空间,若指针存储的地址对应某块已被使用的内存字节,则称“指针指向该字节对应的变量”。
2026-01-28 17:21:51
945
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅