- 博客(127)
- 收藏
- 关注
原创 Linux 之 【进程替换】(execl、execlp、execle、execv、execvp、execve)
char* const p 的特点是 p 的指向无法改变,exec系列的部分函数中设计该类指针的数组,这就能够保证函数内部无法修改数组元素的指针指向exec系列函数通过替换把可执行程序导入了内存,起到了代码级别的加载器效果不同语言形成的可执行程序最终会成为进程,所以一旦指明了路径与执行命令,exec系列函数就能替换并运行不同语言形成的可执行程序显然,exec系列函数中l、c不能同时存在函数名参数传递形式程序文件查找方式环境变量传递核心特点与适用场景execl列表(可变参数)需提供。
2025-12-10 18:42:58
1085
原创 Linux 之 【简易版的命令行解释器】(getcwd、strtok)
本文介绍了命令行解释器(CLI Shell)的实现原理和过程。首先解释了CLI Shell作为用户与操作系统内核间的"翻译官"角色,通过接收、解释和执行用户命令实现交互。然后详细描述了实现流程:获取命令行、解析命令行、创建子进程(fork)、替换子进程(execvp)和等待子进程退出(wait)。文章给出了具体的C语言实现框架,包括交互界面(interact)、命令解析(splitString)、内建命令执行(buildCommand)和普通命令执行(normalExecute)四个核心
2025-12-10 18:42:42
841
原创 Linux 之 【进程的创建与终止】(fork、退出码与错误码、errno、strerror、perror、exit、_exit)
为此,创建子进程之初,父子共享同一份物理内存数据,页表都标志为只读,当父或子任意一方尝试修改共享数据时,触发缺页中断机制,操作系统这才为修改方分配新的物理内存并将原数据复制到新内存中,然后再进行写入操作,并同时修改对应的页表映射关系。退出码用于计算机存储识别,退出描述就让用户知晓当前程序的运行结果,从而执行下一步决策,实际过程中,我们也可以建立一套自己的<退出码,退出描述>体系(字符串数组,下标即退出码,对应字符串即为退出描述)标准规定,0表示代码运行完毕,结果正确,非0表示代码运行完毕,结果不正确。
2025-12-09 17:22:19
983
原创 Linux之【环境变量】(env、echo、set、export、unset、PATH、getenv、putenv与setenv、chdir,main函数带参,环境变量的全局属性,本地变量与内建命令)
参数项名称与含义数据类型内容说明关键特性argc参数计数器int命令行参数的总个数值至少为 1(因为argv[0]总是存在)argv参数向量或字符串指针数组,每个元素指向一个参数字符串1.argv[0]:程序名2.argv[1]...:用户参数3.argv[argc]保证为NULL第三个参数 char* env[]不常用项目说明全称功能改变当前进程的工作目录系统调用头文件参数path: 目标目录的路径字符串返回值成功返回0,失败返回-1并设置errno影响范围。
2025-11-27 19:21:22
603
原创 Linux 之 【进程状态(僵尸进程、孤儿进程)、PCB的组织形式与进程优先级】
若父进程先结束,子进程会成为孤儿进程,此时为了避免资源泄漏(如未释放的PCB、内存等),子进程会由操作系统的 初始化进程(如 init 或 systemd) 自动接管,成为其子进程。子进程处于僵尸(Z)状态的原因是为了等待父进程读取子进程的信息,如果父进程不读取,子进程将一直处于Z状态,从而造成内存泄漏。进程通常有多个,CPU一次只运行一个进程,所以不同进程之间自然就存在竞争关系,操作系统为了保证良性竞争为进程设定了优先级的概念。这个状态用户几乎看不到,因为它是一个瞬时状态,进程会很快从进程表中被移除。
2025-11-19 15:21:34
796
原创 专题六 之 【模拟】
细节二:5个if\else语句也不是不行,这里使用数组模拟哈希表,再来一个哈希表建立字符与下标间的映射关系,这样,通过字符可以找到下标,通过下标可以找到对应字符的数量。细节一:问号前一个字符与后一个字符最多占字母表中的两个字符,a~c有三个字符,其中一定有字符与问号前后字符都不相同的字符。= s[left],此时 right-left 就是字符 s[left] 的数量,添加形成编码,细节一:更新行程编码后,left移动到right当前位置,而right不动,保持逻辑一致(初始时,二者位置相同)
2025-11-19 15:21:26
621
原创 专题五 之 【位运算】
:有0就是0 |:有1就是 ^:相同为0,相异为1/无进位相加能加括号就加括号,减少记忆成本给一个数n,确定它的二进制表示中的第x位(从右向左从0开始计数)是0还是1:将数n右移x位并于1进行&运算,结果为0就是0,为1就是1将1左移x位并与数n进行或(|)运算先将1左移x位再将其取反,取反后的结果与数n进行与(&)运算提取一个数n二进制表示中最右侧的1:n &= (-n)一个数的相反数在二进制上的表示为原数最右侧的1之前的位全部取反,其他的不变。
2025-11-16 10:22:11
658
原创 Linux 之 【进程的概念、task_struct、查看进程(proc、ps、kill)、fork创建进程】
初始时共享是因为如果为子进程完全拷贝一份父进程的代码,很可能会出实现使用率不高的情况,修改时才不共享是因为如果对于修改的数据父子进程进行共享,就会导致父子进程间进行互相影响,此时操作系统进行。PID、PPID属于进程信息,操作系统负责管理进程,那么进程信息就属于操作系统内部的数据。代码是只读的,共享同一份代码在不考虑数据影响的情况下,由于父子进程都无法修改代码,所以进程安全性得到了保障。,即当子进程需要父进程中的某一份数据时,操作系统才为其创建独立的空间存储属于子进程自身的数据。
2025-11-13 12:34:48
996
原创 Linux 之 【冯诺依曼体系结构与操作系统的简介】
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系冯诺依曼体系由5部分组成:a.存储器,通常指主存储器(内存),是程序和数据的主要存储空间b.输入设备,将程序与数据输入到存储器中,常见的有:键盘、鼠标、网卡等c.输出设备,从存储器中拿到计算器的处理结果并展示出来,常见的有:显示器、网卡d.运算器,负责进行逻辑运算与算术运算e.控制器,控制协调包含自身在内的硬件间的工作流程(1)输入设备与输出设备统称为外设,CPU、存储器之外都叫外设。
2025-11-12 16:42:43
1138
原创 基于哈夫曼树的数据压缩算法
字符、下标、频率三个变量后续常用,下标可用数组处理,将字符、频率封装为一个“字符类”,那么数组中存储字符类对象,通过下标就可以找到对应字符类对象及其频率,再创建一个哈希表,建立字符与下标间的映射关系,那么通过字符就可以找到下标,进而找到频率。(2)新节点的权重等于挑选出来的两节点权重之和,新节点的左右孩子为挑选出来的两个结点(顺序可交换),新节点的父亲不变,仍为0,挑选出来的两个结点的父亲节点就是他们组成的新节点。node1是父亲结点为0,权重最小的结点,node1是父亲结点为0,权重次小的结点。
2025-11-10 17:14:22
690
原创 专题四 之 【前缀和】
对于每个位置 i ,使用哈希表查找和为dp[i]-k的前缀和的过程中,可包含长度为 1~i 的和为K的子数组的情况,但是,当[0, i]区间整体的和为K,即和为K的子数组的长度为 i+1时,需要查找和为0的前缀和,为防止漏加,hash[0] = 1。对于每个位置 i ,使用哈希表查找和为余数相同的前缀和的过程中,可包含长度为 1~i 的和为K的子数组的情况,但是,当[0, i]区间整体的和为nK,即和为nK的子数组的长度为 i+1时,需要查找余数为0的前缀和,为防止漏加,hash[0] = 1。
2025-11-08 15:57:05
1152
原创 Linux第一个小程序 之 【进度条】
关于打印:%-100s表示左对齐,宽度为100的字符串,%d%%,打印当前进度百分比,%c,模拟进度扩展时的旋转圈,\r回车,每次从头开始打印,因为rate持续增大,所以效果就是覆盖写,并逐渐增加。不加任何格式控制,字符串将在缓冲区中保存,当程序结束时,缓冲区才会被刷新,字符串才会被打印出来,由于未换行,字符串后面紧跟命令行。上述代码的结果是先停3秒,再打印出字符串hello Makefile!,停3秒,再紧跟着出现命令行。,停3秒,再换行出现命令行。\n(换行):光标移动到下一行(不同系统实现不同)
2025-11-08 15:56:58
641
原创 专题三 之 【二分查找】
当查找的数据将整堆数据划分为两部分,即数据具有二段性时二分查找就可以很好的解决问题,并不只有有序数组才能使用二分查找算法朴素二分查找模板//朴素二分查找//中间点的取值,向上或向下取整均可//核心移动逻辑二分查找左边界模板while(left < right)//结束条件,分情况证明二分查找右边界模板//左端点可以不动根据二段性理解记忆上述模板,下面通过例题来初步感受二分查找算法。
2025-10-30 22:08:37
935
原创 Linux基础开发工具 之 【gdb、make\makefile、git】
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么报错退出。
2025-10-30 22:08:28
916
原创 KMP模式匹配算法
子串与主串部分匹配的字符串中,若不存在相同的前缀与后缀,那么 i 一定还会移动到回退前不匹配的位置例如上面的abcd是部分匹配的字符串,但是串中没有前缀与后缀相同,即使 i 回溯,重新进行匹配,仍旧回到了不匹配的 f 字符处子串与主串部分匹配的字符串中,若存在相同的前缀与后缀,那么 i 也一定还会移动到回退前不匹配的位置例如上面的abcabab是部分匹配的字符串,前缀ab与后缀ab相同,即使 i 回溯,重新进行匹配,仍旧回到了倒数第二个字符c处。
2025-10-27 17:47:25
1087
原创 专题一 之 【双指针】
虽然叫做双指针算法,但我们不一定使用的是指针,可能是数组下标,也可能是特定的数通过做题来初步了解双指针算法,下面的例题均可在leetcode上搜到n 指的是数组的元素个数。
2025-10-18 14:02:59
665
原创 Linux 之 【Linux常见指令 与 shell命令以及运行原理】
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。公历是现在国际通用的历法,又称格列历,通称阳历。常用选项: 举例: -3 显示系统前一个月,当前月,下一个月的月历 -j 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)常用选项: -a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类 型,硬件平台类型,操作系统名称。
2025-10-12 20:53:43
985
原创 数据结构 之 【LRU Cache】(注意list的splice接口函数)
LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是 Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用 DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种 硬件之间, 用于协调两者数据传输速度差异的结构。
2025-10-04 13:58:30
1029
原创 数据结构 之 【图的最短路径】(Dijstra、BellmanFord、FloydWarShall算法实现)
算法时间复杂度空间复杂度适用场景DijkstraO(V²)非负权图,稀疏图优先堆优化BellmanO(V²)含负权边单源问题,邻接表优化FloydO(V³)O(V²)多源最短路径,小规模图。
2025-10-02 22:19:17
699
原创 数据结构 之 【图的遍历与最小生成树】(广度优先遍历算法、深度优先遍历算法、Kruskal算法、Prim算法实现)
下述算法实现是在上一期邻接表实现图的代码基础上实现的。
2025-09-28 21:26:39
772
原创 数据结构 之 【图】(图的基本概念与图的存储结构:邻接矩阵、邻接表)
因为节点与节点之间的关系就是连通与否,即为0(不连通)或者1(连通)或者附带权值(连通),先用一个数组将顶点保存,然后采用矩阵来表示节点与节点之间的关系注意:1.无向图的邻接矩阵是对称的,第i行(列)元素之和,就是顶点i的度。有向图的邻接矩阵不一 定是对称的,第i行(列)元素之后就是顶点i 的出(入)度。2. 如果边带有权值,并且两个节点之间是连通的,上图中的边的关系就用权值代替,如果两个顶点不通,则使用无穷大代替3. 邻接矩阵存储图优点是能够快速知道O(1)两个顶点是否连通,适合稠密图缺陷。
2025-09-26 10:43:41
1154
原创 C++ 之 【C++的IO流】
int main()//自定义类型<-内置类型A aa1 = 1;//内置类型<-自定义类型return 0;成员函数 operator int 使得自定义类型能够隐式转换为内置类型 intexplicit 修饰构造函数,禁止隐式类型转换,仍可通过显式调用构造(A aa1(1);
2025-09-21 21:29:51
910
原创 C++ 之 【特殊类设计 与 类型转换】
目录1. 特殊类设计1.1 不能被拷贝的类1.2 只能在堆上创建对象的类1.3 只能在栈上创建对象的类1.4 不能被继承的类1.5 只能创建一个对象的类(单例模式)饿汉模式懒汉模式2. 类型转换2.1 C语言中的类型转换2.2 为什么C++需要四种类型转换2.3 C++强制类型转换static_castreinterpret_castconst_castdynamic_cast3. RTTI(了解)
2025-09-21 19:12:33
665
原创 C++ 之 【智能指针的简介】
weak_ptr不参与资源管理(不拥有资源,不控制生命周期)。weak_ptr不是 RAII(资源获取即初始化) 的实现,因为它不负责释放资源。weak_ptr不直接参与引用计数(不增加强引用计数,但通过弱引用计数辅助 shared_ptr 的控制块管理)。weak_ptr提供类似指针的访问行为(需通过 lock() 获取 shared_ptr 后解引用)。public::_ptr(ptr){}//sp1(sp2){}{}//1.指向同一块资源的指针没必要赋值。
2025-09-18 16:54:31
1083
原创 C++ 之【C++11的简介】(可变参数模板、lambda表达式、function\bind包装器)
一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M 可以大于N,但这么做没什么意义)参数的新函数。lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。[&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量。std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),作用:通用函数包装器,可以存储可调用对象(函数、Lambda、函数对象、成员函数等)
2025-09-15 17:55:40
964
原创 C++ 之 【C++11的简介】(列表初始化、decltype、右值引用和移动语义、完美转发、移动构造函数、移动赋值重载函数、=delete、default)
可添加等号(=),也可不添加。
2025-09-15 17:13:17
1065
原创 数据结构 之 【布隆过滤器 的简介】
比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其 他元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。近似算法:用布隆过滤器a标记A文件的query,遍历文件B的Query,若布隆过滤器a返回"可能存在",则记录为交集(可能有重复的query,当然也存在误判)哈希切分后,使用unordered_map统计文件中的Ip地址的出现次数,统计完一个文件,使用变量标记该IP地址及其次数,持续进行统计次数、更新变量的操作。
2025-09-10 16:33:24
1031
原创 数据结构 之 【位图的简介】
数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一 个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0 代表不存在。表示一个数据的状态信息,适用于海量数据,数据无重复的场景。因为位运算操作的是数据的二进制位模式,而非内存中的字节顺序,所以我们不必关注端序。<< 左移运算符的特点,数据的二进制为向高位移动,左边舍弃,右边补0。<< 左移运算符的特点,数据的二进制为向高位移动,左边舍弃,右边补0。数据存在,数组中对应数据的对应比特位为1,表达式不为0,为真。
2025-09-10 16:14:25
1072
原创 C++ 之 【unordered_map 和 unordered_set 的模拟实现】(只涉及插入、迭代器以及unordered_map 的operator[ ]函数)
unordered_map 和unordered_set 底层是哈希表,即下面使用的是在上一期博客的基础上进行迭代更新的。
2025-09-07 14:08:51
648
原创 数据结构 之 【模拟实现哈希表】
是,我们不选择复用insert函数,因为旧表中的节点都是我们手动创建的,如果我们选择复用insert函数的话,我们需要在复用完成之后交换哈希表之前完成节点的资源释放,否则就会造成资源泄露,遍历旧表,从有效位置(节点指针不为空)开始,将节点“摘”到新的哈希表中(这里需要更新哈希地址同时注意头插及cur指针的移动),最后完成交换操作即可。(2)开散列中,查找的思路是,通过取模找到对应的哈希地址,然后遍历链表进行查找。(3)_table 存储的就是每一个单链表的头节点,_n指的是有效数据的个数。
2025-09-04 16:36:17
1176
1
原创 数据结构 之 【哈希的相关概念】
桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端情况下,可 能会导致一个桶中链表节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希 表进行增容,那该条件怎么确认呢?,通过哈希函数获取待插入元素在哈希表中的位置 如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突, 使用线性探测找到下一个空位置,插入新元素。闭散列也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。
2025-09-04 12:26:18
1129
1
原创 C++ 之 【map和set的模拟实现】(只涉及map和set的插入、迭代器以及map的operator[]函数)
map和set底层是红黑树,即下面使用的红黑树是在上一期博客模拟实现的红黑树的基础上进行迭代更新的。
2025-08-30 20:56:10
902
原创 数据结构之 【红黑树的简介与插入问题的实现】
使用 KV 模型, 此概念可参考 前期博客 二叉搜索树的应用enum ColorRED,BLACKColor _col;{ }(1)节点非黑即红,使用枚举列举两种颜色RBTreeNode类负责树节点的定义及初始化:(1)使用模板,以适应不同数据类型(2)struct定义,将节点暴露方便后续使用(3这里使用三叉链,即一个节点既保存其左右孩子节点指针又保存其父亲节点指针(4)节点中再保存存储数据的 _kv 及 颜色表示 _col。
2025-08-27 16:39:05
830
原创 数据结构 之 【AVL树的简介与部分实现】(部分实现只涉及AVL树的插入问题,包括单旋((右单旋、左单旋))、双旋(左右单旋、右左单旋)等操作)
/模板,以适应不同数据类型struct AVLTreeNode//struct定义,将节点暴露方便后续使用//三叉链//键值与平衡因子K _key;int _bf;//new一个新节点时需要调用节点的构造函数{ }//其余默认构造使用编译器自动生成的即可,这里暂且不用手写,也用不到这个类负责树节点的定义及初始化:(1)使用模板,以适应不同数据类型(2)struct定义,将节点暴露方便后续使用(3这里使用三叉链,即一个节点既保存其左右孩子节点指针又保存其父亲节点指针。
2025-08-23 19:47:37
897
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅