- 博客(35)
- 收藏
- 关注
原创 Linux的奇妙冒险———进程信号
非可靠信号(不可靠信号): 指的是信号值 1 到 31 之间的信号(即传统的标准信号,如 SIGINT, SIGTERM 等)。可靠信号(实时信号): 指的是信号值 34 到 64 之间的信号(即 SIGRTMIN 到 SIGRTMAX)。• 函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表⽰该信号集的有效信号包括系统⽀持的所有信号。函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表⽰该信号集不包含任何有效信号。
2025-08-25 22:34:35
1361
2
原创 Linux的奇妙冒险——进程间通信(管道、SystemV IPC)
⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据。• 进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。通常,⼀个管道由⼀个进程创建,然后该进程调⽤fork,此后⽗、⼦进程之间就可应⽤该管道。原子操作: 对信号量的操作(wait 和 signal)都是原子的,不会被其他进程打断,这是它能正确实现同步的基础。
2025-08-21 23:59:23
951
1
原创 Linux的奇妙冒险——文件系统与inode
本文摘要: 文章从磁盘底层结构入手,首先介绍了CHS(柱面-磁头-扇区)物理寻址方式及其容量计算方法,以及现代磁盘使用的LBA(逻辑块地址)抽象机制。接着阐述了文件系统的基本概念,包括块设备特性、分区原理和inode结构。重点讲解了Ext2文件系统的组织方式,包括磁盘分区、块组管理、inode索引机制等核心设计。通过分析文件存储的物理实现,揭示了操作系统如何将磁盘物理结构抽象为逻辑文件系统,实现高效的文件管理和存取。
2025-08-20 14:57:53
776
原创 Linux的奇妙冒险——进程pcb第二讲
本文介绍了进程控制相关的核心概念和操作。主要内容包括:1) fork函数创建子进程的原理及写时拷贝机制;2) 进程替换函数族的用法和区别;3) 进程退出码和exit函数;4) 进程回收机制wait/waitpid的使用方法。重点讲解了父子进程的执行流程、进程替换的实现原理、如何获取进程退出状态信息等关键知识点,并辅以代码示例说明。这些内容是理解Linux进程管理的基础,对开发多进程程序具有重要意义。
2025-08-20 14:51:29
922
原创 Linux的奇妙冒险——环境变量
例如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。在学习c语言时,我们通常给主函数int main()括号里无参数,但实际上,主函数括号里可以传参,这里的参数叫做命令行参数。提出个问题,为什么系统自带的命令不需要添加执行路径,而我们自己写的exe可执行文件需要加上。PATH:定义了命令搜索路径,决定了系统可以执行的命令所在的目录。路径下,而系统的环境变量PATH默认添加了该路径。
2024-12-10 19:33:53
1065
2
原创 Linux的奇妙冒险——进程PCB第一讲
当进入操作系统后第一个运行的进程就是操作系统内核,操作系统引导程序(BIOS或UEFI)在开机时首先执行,并将控制权转交给操作系统内核,操作系统对于进程管理进行“先描述,后组织”,对每一个进程分开描述,在进行统一管理,每一个进程被使用STRUCT_PCB,进行描述。创建新进程: fork()函数用于创建一个新的子进程,该子进程是原进程(即父进程)的副本。进程被其父进程暂停: 如果进程的父进程使用 ptrace() 系统调用暂停了子进程,则子进程也会进入暂停状态。这样可以让进程区分它是父进程还是子进程。
2024-12-02 15:22:18
1164
3
原创 哈希算法以及容器实现
哈希算法是一种将输入数据(或称为“消息”)转换为固定长度的散列值(哈希值)的算法。它广泛应用于数据存储、加密、数据完整性检查等领域。讲通俗点就是将分散的数据重新映射,使其重新分布在某些区间,方便储存和统计。
2024-09-27 12:55:22
1104
3
原创 hello树先生——红黑树
节点颜色:每个节点要么是红色,要么是黑色。根节点:根节点始终是黑色。红色节点:红色节点的子节点不能是红色(即没有两个连续的红色节点)。黑色节点:从任何节点到其每个叶子节点的路径上,必须包含相同数量的黑色节点。叶子节点:所有叶子节点(空节点)都是黑色。红黑树的这些特性确保了树的高度是对数级别,从而保证了基本操作(如插入、删除和查找)的时间复杂度为O(log n)。这种结构常用于实现关联数组和集合等数据结构。
2024-09-02 20:32:24
1139
2
原创 hello树先生——AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
2024-08-31 21:20:54
843
2
原创 hello树先生——二叉搜索树
由于搜索二叉树特性所以中序遍历是有序结构,且在插入时当相同key插入会限制插入,所以兼顾排序和去重。搜索二叉树的数据结构仍然仅需维护一个node*的指针root就好。如果要插入的根节点为空的话,仅需要将插入节点赋为根。删除的节点分为三种类型,左为空,右为空,都不为空。左右都不为空,则不能简单删除,而需要替换法。寻找目标插入的位置,从根节点开始向下寻找。将需要删除的节点与右数的最小节点交换。首先找到需要删除的目标节点。
2024-08-31 13:04:54
566
2
原创 c++标准库STL————string类的基础模拟
该过程通常使用[]运算符重载,和迭代器begin,end,rbegin,rend,范围for等。4.assign函数通常用于将一个字符串的内容替换为另一个字符串的内容。对类成员大小的访问和手动修改,尤其是reserve和clear使用频繁。c11提供了许多参数的重组,但通常这四种类型的构造较为常用。使用对象构造,通过现代写法,可以复用1,3函数。2.append将字符串尾加至对象,与+=一致。剩下几个函数,分别为插入,删除,交换,尾删等。经过观察,1,3可以通过缺省值进行合并。3.push_back尾插。
2024-08-09 10:27:09
593
3
原创 c++入门语法——初始化列表,静态成员,友元,内部类,匿名对象
定义时不添加static关键字,类中只是声明类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。
2024-07-08 10:40:45
1107
2
原创 使用c++类模板和迭代器进行List模拟实现
对迭代器封装使得用户在使用时,不用过多的繁琐操作,仅需使用一个迭代器就好,在内部typedef使得iterator有更强的适配性。这里重载的符号为->返回的节点val值的地址,按理在调用时it->为地址,则需要。这里创建一个clear函数配合erase将节点统统释放,最后释放掉哨兵位头节点。两个版本的迭代器,自主挑选,由于前方处理过细节所以这里函数类型就不会冗余。如节点为A类型的结构体,想通过迭代器访问_a,_b,有两种方法。这里相当于对指针解引用,拿到节点,对节点直接访问。让头节点的前后指针指向自己。
2024-04-28 19:28:07
1992
4
原创 c++基础语法—————默认成员函数
对于内置成员变量,如int,char…,编译器不会初始化,该数据仍是随机值因为没有明确定义,所以初始化大概率不符合预定对于自定义成员变量,则编译器会主动寻找它的构造函数并进行调用public:private:int _year;int _month;int _day;Time _t;public:cout
2024-03-15 14:19:22
1165
21
原创 c++入门语法————初识类和对象
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。在c语言中,仅支持的自定义类型为struct,且结构体成员仅为数据变量。在c++在保留了,struct且拓展了class,结构体内不仅可以定义变量,也可以定义函数。需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。int _age;
2024-03-05 13:56:01
981
8
原创 c++入门语法—————引用,内联函数,auto关键字,基于范围的for循环,nullptr
内联函数的目的是减少函数调用的开销,提高程序的执行效率。在代码量较少函数栈区未清理时,会存在正确情况,但一旦清理,将意味着引用将指向一个无效的内存地址。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。在c/c++中,局部变量储存在栈中,随着函数生命周期结束,栈帧也随之销毁,在程序后期这片内存会清理分配给其他局部变量使用。在C++11及以后的标准中,auto关键字还可以用于迭代器的声明和lambda表达式的返回类型推断。
2024-01-29 11:41:02
1392
8
原创 Linux的奇妙冒险———vim的用法和本地配置
Vim是一款文本编辑器,是Vi的改进版本。它是一个开源软件,可在各种操作系统上运行。Vim具有强大的编辑功能,支持多种编程语言和文件格式,可以通过插件扩展功能。它也具有高度可定制性,用户可以通过配置文件自定义编辑器的行为和外观。Vim是程序员和系统管理员常用的编辑工具之一。
2024-01-24 18:23:35
2375
20
原创 C++入门语法———命名空间,缺省参数,重载函数
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。int a = 10;int b = 20;在主函数中使用命名空间的成员,是无法直接使用的,需要加上所命名的空间。函数重载是指可以定义多个具有相同名称但参数列表不同的函数。这意味着在同一个作用域内,可以有多个同名函数,只要它们的参数列表不同即可。在调用函数时,编译器会根据传入的参数类型和数量来确定调用哪个重载函数。函数重载的主要特点包括:1.函数名称相同,但参数列表不同。
2024-01-24 13:14:14
1008
12
原创 排序嘉年华———归并排序
建立一个临时数组,然后将数据两两归并放入临时数组,最终将有序数组拷贝回目标数组中。非递归思路是由分散的每个数据两两归并,然后成倍增加归并个体的数量,如下图。
2024-01-16 21:20:05
953
34
原创 函数指针和回调函数
函数指针是指向函数的指针。在C语言和C++中,函数指针可以用来存储函数的地址,并且可以通过函数指针来调用函数。也可以作为函数的返回值。通过函数指针,可以实现回调函数和动态函数调用等功能。通过函数指针,可以实现回调函数和动态函数调用等功能。函数指针的类型由函数的参数和返回值类型来确定。函数指针在一些高级的编程技术中经常被使用,例如函数指针数组、函数指针作为结构体成员等。
2024-01-11 19:20:04
1547
35
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅