- 博客(51)
- 收藏
- 关注
原创 Linux:文件系统
❗ 如果我们不小心误删的一个文件,如果这个文件很重要,最好的办法就是什么都不做然后找专业的人去恢复(一般来说恢复其实就是得找到该文件的inode编号,比如通过Linux的日志信息找到被删文件的inode,但是具体怎么恢复得依靠一些专业的东西!记录的信息主要有:bolck和inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。要访问它,不也得知道当前⼯作⽬录的inode吗?
2025-04-20 16:40:21
753
原创 Linux进程:进程控制
😇在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为子进程,⽽原进程为父进程。::——》解释:pid_t 类型在底层中就是int类型,当进程创建成功时,父进程的fork的返回值为子进程的pid,子进程的fork返回值为0,如果失败则返回 -1。——》进程调用fork,当控制转移到内核中的fork代码后,OS做四件事情::——》代码说明:父进程创建子进程,父子进程分别打印自己的pid,ppid,fork的返回值。:通常,⽗⼦代码共享,⽗⼦再不写⼊时,数据也是共享的
2024-11-27 11:03:53
940
原创 Linux进程:环境变量与进程地址空间
💭环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,它一般具有全局属性。💭环境变量表记录这每个环境变量,每个程序都会收到一张环境变量表,它是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,这个指针数组以NULL结尾echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量unset: 清除环境变量set: 显示本地定义的shell变量和环境变量——》
2024-11-10 22:05:53
1058
原创 Linux进程:进程概念
在课本的概念中,进程程序的一个执行实例,正在执行的程序。其内核观点:担当分配系统资源(CPU时间,内存)的实体。但这些概念太笼统,并不能让我们更加清晰的知道进程是什么,实际上,进程是内核数据结构(pcb) + 程序的代码与数据。pcb(process control block)进程控制块,进程信息被放在一个叫pcb的数据结构中,可以理解为进程属性的集合。在Linux入门学习:深刻理解计算机硬件与OS体系中,我们已经了解到。
2024-09-24 21:47:08
1209
原创 Linux入门学习:深刻理解计算机硬件与OS体系
在这个例子中,银行就是OS,银行的设备就是计算机硬件,前台就是操作系统向上提供的接口,大堂经理就是程序员开发的软件。假如学校需要各个同学的身份信息,名字等一些列数据,肯定不是一个一个找同学要的,而是拜托我们的执行者----辅导员,让每个年级的辅导员收集好每个同学的信息,将他们的数据用excel排列好,再向上级提交。例如我在外设写了一个程序,我要运行它,就要把它加载到内存,在程序加载到内存的过程中,CPU是不会停止工作的,它在处理其他的工作(进程),当你的程序加载到内存时,CPU也就刚好要运行你的程序了。
2024-09-23 17:08:38
1069
原创 Linux入门学习:Linux调试器gdb使用
程序的发布方式有两种,debug模式和release模式,debug是添加调试信息,release是取消调试信息,list/l 行号:显示源代码,接着上次的位置往下列,每次列10行。print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数。info(或i) breakpoints:参看当前设置了哪些断点。undisplay:取消对先前设置的那些变量的跟踪。
2024-09-20 16:41:14
541
原创 Linux入门学习:make/Makefile(Linux项目自动化构建工具)
我们观察到上面的现象,原先make一次之后,再make就会失败,但是在修改了一个文件之后,就又可以make进行编译了,为什么有时文件可编译,有时却不可编译?正如上面的指令,有时我们只需要一个make,就可以完成对当前目录下的文件的编译。使用make的前提,是配置好makefile文件。这也是一个类似于有依赖关系与依赖方法的代码,与上面的代码相比,这里不同的在于,2️⃣make是如何工作的,在默认的方式下,也就是我们。,什么是make/makefile?,那么,我们应该如何清理?
2024-09-20 09:16:31
1035
原创 Linux入门学习:Git
🔹通过ctrl z终止了新出现的页面后,再重新输入正确的指令有可能会出现git进程阻塞的问题,一直提示还有git进程,无法commit,从而无法push的情况。本文介绍如何在Linux操作系统下简单使用git,对自己的代码进行云端保存。❗注意,日志是记录此时上传是做了什么操作的,一般不能随便乱写。有时我们会遇到这样的情况👇。
2024-09-17 16:23:25
798
原创 Linux入门学习:Linux编辑器-vim使用
在C语言中,库指的是通过#include 调用的文件,而动态库和静态库并不是指库本身是静态的或者动态的,而是链接方式是静态的还是动态的,我们在上面调用的都是动态链接。在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母。vim有很多的模式,但基础的模式一般只用掌握三种:是。分别控制光标左、下、上、右移一格。,他们的基本功能如下。🔹二者在使用上的区别。
2024-09-16 16:04:22
1129
原创 Linux入门学习:Linux权限理解
🔸例如,Sherry创建了一个目录,在目录当中创建了一个文件,并设置目录的other具有rwx权限,目录内的文件的other只有r权限,虽然Lvision不具有这个文件的w权限,但有这个目录的w权限,就可以删除这个由Sherry创建的文件。文件属性的第一位表示文件的类型,那么2-10位那一串字符,表示文件的权限值,🔹除了字符的表达方法,权限还有八进制的表达方法,以。
2024-09-13 08:55:12
793
原创 C++_进阶:红黑树性质及模拟实现
🔹在平衡二叉树(KV结构)的基础上,红黑树节点比一般平衡二叉树多了parent指针(指向父亲节点的指针)和colour(颜色枚举)。//红黑树节点的颜色RED,BALCK//键值对//左孩子//右孩子//父亲//颜色-> 注意: 默认为红色节点//构造函数:_kv(kv){}
2024-08-26 16:10:32
1098
原创 C++_进阶:二叉搜索树
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,4. 当**树不为空(root!= nullptr )**时,,再来处理该结点的删除问题–替换法删除。情况3比前两种复杂一点,需要在它的。先查找元素是否在二叉搜索树中,插入和删除操作都必须先查找,再实现二叉搜索树本体。
2024-08-17 18:57:58
891
1
原创 C++_进阶:C++11新增语法(2)
在 C++入门 类和对象:构造函数,析构函数,拷贝构造 中,提及类的默认成员函数有以上6个,C++11 新增了两个:移动构造函数和移动赋值运算符重载,所以之后的类的默认成员函数有8个了 。C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化。C++11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数,但是因为一些原因这个函数没有默认生成。比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成。4. 禁止生成默认
2024-08-14 16:40:04
797
原创 C++_进阶:多态详解
📝多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态有十分重要❗的两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数且派生类必须对基类的虚函数进行重写public:cout << "买票-全价" << endl;return 0;public:// 重写/覆盖cout << "买票-半价" << endl;return 0;
2024-07-24 17:08:26
1173
原创 C++_进阶:继承详解
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄protected:int _stuid;// 学号int main()//实例化派生类Student s;//在派生类使用父类的函数。
2024-07-14 16:12:32
999
原创 C++_模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。
2024-06-08 21:21:17
827
原创 C++ priority_queue简单源码剖析:priority_queue模拟实现
被叫做优先队列优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素),其数据结构类似于大堆。优先队列被实现为容器适配器容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2024-06-03 23:16:42
1071
1
原创 C++_deque:deque的数据结构特点
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。总得来说,deque就像vector和list的结合体,它的尾插与尾删总体上比较好,同时也能头删和头插deque的逻辑结构。
2024-06-03 11:18:41
1139
原创 C++_vector简单源码剖析:vector模拟实现
没错,在C++中,内置类型可以像类一样传参初始化,当然就如原本的内置类型一样,不传参就是随机值,传了的那个形参就是参数的值。本文会模拟一个基本的vector类,帮助我们更好的理解vector的内置函数的实现与规则。,cosnt又为这个临时对象赋予常性,就可以起别名,所以这样的语法就可以通过了。这样做有什么好处呢?,我们知道,编译器在我们写了其他的构造函数时是不会生成默认构造的,
2024-05-25 11:56:10
1160
原创 C++_vector操作使用
vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,所以。
2024-05-19 15:54:43
945
原创 C++入门 string类(第二章):string类对象的容量操作,string类对象访问元素,string类对象的字符串操作(查找)
这个属性与size不同,size是现有成员的个数,capacity是现有容量大小,当size = capacity时,对象会扩容。这其中的缘由是因为,vs2022一开始是在栈上存字符串,而扩容的操作实际上的在堆上开空间,再把字符串拷贝进去的,这是vs2022对string类优化的一种方式。:在vs2022有点需要注意,对于长度不大的string类对象,其字符串是建在栈上的,长度大的string类对象是建在堆上的。分别返回string的尾字符和头字符,这两个函数返回的是引用,是字符本身。
2024-05-10 20:53:35
769
原创 C++入门 string类(第一章):string类对象的构造,string类对象的访问即遍历,string类对象的增与删
总结:6. string是表示字符串的字符串类7. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。8. string在底层实际是:basic_string模板类的别名,typedef basic_stringstring;9. 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;库里string类对象的构造方法:strin
2024-05-06 23:33:12
776
原创 C++入门:模板(初阶)
对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,用不同类型的参数使用函数模板时,称为函数模板的实例化。模板是一种与类型无关的通用代码,实现代码复用,编写这样的代码又称作。类模板实例化与函数模板实例化不同,模板是泛型编程的基础。
2024-04-24 19:35:28
391
原创 C/C++入门 内存管理
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。
2024-04-24 08:50:20
700
原创 C++入门 类和对象:深入构造函数,static成员,友元函数
class Apublic://单参数A(int x )//....A test = 3;内置类型是无法直接赋值给自定义类型的,那么A test = 3;是如何成立的?这其中就存在隐式类型转换:内置类型3先隐式类型转换,调用A的构造函数先创造一个临时对象,再通过拷贝构造,将临时变量拷贝给test。当然要特别注意,因为A类具有单参数的构造函数,所以可以支持这一行为。class Apublic://....int main()//多参数隐式类型转换要用{ }
2024-04-20 23:33:16
1229
原创 C++入门 类和对象:赋值重载,const成员,取地址及const取地址操作符重载
此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符。在类中,用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝(类似默认拷贝构造)。日期类的实现不仅是完整的实现其成员变量和成员函数,也要全套设计其运算符重载。此后所有的前置或后置类型符号的重载,都形似前置++和后置++的方式区分。我们知道,类是不能用符号直接进行比较的,但如果要用 运算符。我们知道,无论是前置++还是后置++,其所用的运算符都是。上文介绍了前三个默认成员函数,本文会介绍剩下三个,
2024-04-17 21:43:43
955
1
原创 C++入门 类和对象:构造函数,析构函数,拷贝构造
同时说明:传入自定义类型作为参数(参数非引用)时,是又创建了个临时类,再调用这个临时类拷贝构造,以你传入的参数作为拷贝构造的参数的。析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用。拷贝构造也是一种构造函数,但其构造的形式是以拷贝的方式进行。调用构造函数,这里Date的构造函数是使类的属性初始化。,需要注意的是,构造函数虽然名称叫构造,但是构造函数的。,创建类类型对象时由。
2024-04-17 16:12:24
815
1
原创 初识C++类和对象
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量 称为类的属性或成员变量;类中的函数 称为类的方法或者成员函数。成员函数如果在类中定义,编译器可能会将其当成内联函数处理。//类的属性//类的方法//入栈代码void pop()//出栈代码int top()//返回栈顶元素int size()
2024-04-07 16:33:03
1032
原创 C++:内联函数inline,auto关键字,基于范围的for循环,nullpter
auto为一个新的类型指示符,auto修饰的变量,是具有自动存储器的局部变量,能自动识别被赋的值的类型而为其赋值。auto声明的变量必须由编译器在编译时期推导而得。int a = 10;return 0;注意!使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
2024-04-05 21:44:37
757
1
原创 C++:命名空间namescape,缺省参数
namescape(关键字) name(命名空间名) { }// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型/结构体int val;
2024-03-28 22:36:35
617
1
原创 C语言:冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,归并排序,计数排序
最好情况 : O(n)最坏情况 : O(n^2)稳定性:稳定。
2024-03-25 19:43:13
945
3
原创 C语言:编译和链接
程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的.i⽂件来确认。⼀个C语⾔的项⽬中可能有多个 .c ⽂件⼀起构建,那多个 .c ⽂件如何⽣成可执⾏程序呢?举个例子,在⼀个C的项⽬中有2个.c⽂件( test.c 和 add.c )。在ANSI C的任何⼀种实现中,存在两个不同的环境。
2024-01-29 15:50:55
839
原创 C语言:C语⾔内存函数
用于移动一个内存块到另一块内存块,在同一个数组中,源内存块和⽬标内存块是可以重叠的。喜欢的话点个👍吧!,拜托了,这对我真的很重要!其复制时会判断情况:(不在同个数组时,其用法与memcpy一致)- 用于直接设置一段内存为相同的数,一般用于初始化。- 用于拷贝(复制)数组到另一个数组里。- 用于比较两段内存(数组)
2023-12-25 23:01:11
941
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人