- 博客(51)
- 收藏
- 关注
原创 【Linux】文件系统
所以我们对一个目录没有r权限的时候,查不了文件内容,因为对目录没有读权限,就无法读取目录的data blocks,系统不让读,读不到,就得不到文件名和inode的映射关系,拿不到inode怎么可能访问到文件。例如,如果你访问 /var/log/syslog,首先检查 / 是挂载在 /dev/sda1 上,然后检查 /var 是否是一个单独的挂载点。例如,如果 / 被挂载在 /dev/sda1 上,那么 / 及 / 下的文件和目录都属于 /dev/sda1 分区。里面的内容包括文件名的inode码。
2025-01-22 18:18:17
706
原创 【Linux】文件描述符fd
我们重新回到2.1open的返回值那块看看返回文件描述符fd,数据类型为整形int main()//以只写方式打开,如果文件不存在则创建if(fd1<0)return 0;return 0;fd1: 3此时文件标识符为3,为什么文件打开从3开始呢?因为进程启动,默认打开了三个标准的输入输出流:stdin,stdout,stderr因为Linux下一切皆文件,这三个标准的输入输出流被当成文件打开了。int main()//以只写方式打开,如果文件不存在则创建。
2025-01-15 18:09:29
1002
原创 【Linux】模拟Shell命令行解释器
snprintf() 是 C语言的一个标准库函数,定义在<stdio.h>头文件中。snprintf() 函数的功能是,并将结果存储在指定的字符数组中。参数returnn。
2025-01-10 23:55:59
854
原创 【Linux】进程控制
在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给⼦进程将⽗进程部分数据结构内容拷⻉⾄⼦进程添加⼦进程到系统进程列表当中fork返回,开始调度器调度。
2025-01-08 17:37:26
675
原创 【Linux】进程地址空间
我们在学习C/C++的时候总是会经常的看到这种内存分布图,我们之前所理解的是程序地址空间,而不是进程地址空间。程序地址空间是指程序在编译链接后,理论上所占据的虚拟地址范围。它是一种静态的概念,主要是由编译器和链接器确定的。进程地址空间是一个进程运行时可以访问的虚拟地址空间,是一种动态的概念。它是在程序执行过程中,。我们先验证一下进程地址空间的基本排布。
2024-12-07 14:09:33
1090
原创 【Linux】命令行参数&环境变量
main 函数⼀共有三个参数,在命令行部分先关注前两个参数:1、:表示命令行参数的个数2、表示命令行参数的清单这里我们可以看到命令行,argc中显示的参数个数,argv命令行参数的清单内容为什么要有这两个参数呢?因为同一个程序,可以根据命令行参数,根据选项的不同,表现出不同的功能。就比如常用指令ls -a,ls -d。main函数的参数是谁给传递的呢?在上进行输入指令加选项,他是,首先会被拿到,根据空格为分隔符进行打散,形成一张表argv[]和元素个数argc。
2024-12-01 18:09:39
823
原创 【Linux】自动化构建工具-make/Makefile
make:一条命令makefile/Makefile:一个文件。文件里面写依赖关系与依赖方法两个搭配使用,完成项目自动化构建。<Tab>必须是隔一个Tab建。代码解析::目标文件。:依赖文件列表。对于proc:proc.c,冒号左侧是目标文件,右侧是它的依赖文件,所以就可以说它们之间存在一种proc:proc.c下面的语句gcc -o proc proc.c叫做:表示声明一个伪目标。(类似于关键字)。:伪目标的一个名称。(类似于变量名)。:clean:单独一行表示这一行的依赖关系,没有依赖列表。
2024-11-11 19:36:49
1143
原创 【C++】智能指针
RAII(Resource Acquisition Is Initialization)是一种(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们。这种做法有两大好处:1.不需要显式地释放资源。2.采用这种方式,对象所需的资源在其生命期内始终保持有效。下面介绍3种智能指针,智能指针最重要的就是拷贝构造。
2024-11-03 10:29:00
754
原创 【C++】异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。
2024-10-30 16:43:32
560
原创 【C++】哈希表
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器(unordered_map,unordered_multimap,unordered_set,unordered_multiset),
2024-10-16 20:32:33
1226
原创 【C++】红黑树
RED,BLACK:_kv(kv), _col(RED) // 颜色默认给成红色{}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?答:优先插入红色不一定能破坏红黑树的性质,如果破坏性质可以通过调整红黑树的颜色来进行修改,但是插入黑色直接破坏红黑树的性质。
2024-10-06 20:37:08
2164
2
原创 【C++】AVL树
AVL的概念:左右子树高度差不超过1因此要在二叉搜索树上增加一个平衡因子(来记录左右子树的高度差),当平衡因子超过1时,就要更新向上调整父节点的平衡因子(因为子节点的平衡因子发生变化,间接的导致父节点的平衡因子发生改变),这时就要知道父节点的位置,因此在二叉搜索树上要多维护一个父节点的指针。int _bf;, _bf(0){}
2024-09-29 22:36:13
700
原创 【C++】map与set
序列式容器vector、list、deque其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高(注:键值对用来表示具有关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
2024-09-23 19:27:09
1048
原创 【C++】多态
也就是说下图中不同类域中的BuyTicket之间也是有隐藏关系的(有些概念不清楚可以看我上篇写的继承)派生类屏蔽了父类同名函数BuyTicket,打印的是半价,指定类域后打印的是全价可以认为重写是一种特殊的隐藏。隐藏包含重写。
2024-09-08 12:02:23
701
原创 【C++】继承
1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。继承和组合public继承是一种is-a的关系(Car和BMW Car和Benz构成is-a的关系,总类的细分支)。也就是说每个派生类对象都是一个基类对象。
2024-08-31 12:45:55
1236
原创 【C++】模板进阶
与。类型形参:出现在模板参数列表中,跟在非类型形参:就是用一个,在类(函数)模板中可将该参数。下面size_t N中的N为非类型形参,class T中的T为类型参数。C++20之前,只允许整形做非类型模板参数C++20,可以支持double(x64)等内置类型注意:1. 浮点数(float(x86,x64),double(x86))、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。这里介绍一个非常鸡肋的头文件先说这个好处,这个头文件的好处。
2024-08-27 11:00:15
867
原创 【C++】stack和queue
stack就类似于我们数据结构所学的栈stack是一种容器适配器什么是适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。举个例子:某插头要求输入:100-240V~,50/60Hz,0.7A输出:5V==3A/9V==3A/12V= 2.25A 20V=1.35A/11V=3A Max这就是适配器。
2024-08-14 15:35:52
933
原创 【C++】vector习题
这里给你一个vector<vector<int>>类型也就是说vector中的各个数据,存的是各个不同的vector思路:先给vector开空间,然后给vector中的vector开空间,并且初始化最后根据数学关系找规律。
2024-08-09 12:52:02
1098
原创 【C++】vector模拟实现
start 首元素地址_finish 尾元素后的地址_end_of_storage 指向最后空间的地址capacity是计算这个空间的大小size是计算空间中存储的个数。
2024-08-04 15:23:30
757
原创 【C++】模板初阶
【函数模板格式】注意:typename是用来定义模板参数关键字,也可以使用class【函数模板的原理】当调试的时候在模板层,但是底层依旧是调用Swap<int>,Swap<double>,不是Swap<T>函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该在编译器编译阶段,对于模板函数的使用,
2024-07-10 16:30:43
352
原创 【C++】内存管理
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数class Apublic:: _a(a)~A()private:int _a;delete p2;return 0;假如不提供默认构造,会发生报错【存储】class Apublic:: _a(a)_a = aa._a;内存存储的是自定义类型。
2024-07-09 20:20:25
725
原创 【C++】入门
底层是一样的可以理解为都是指针2. 引用在定义时必须初始化,指针没有要求3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体4. 没有NULL引用,但有NULL指针5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
2024-05-25 21:56:36
1240
原创 【数据结构】二叉树
前序:根,左子树,右子树中序:左子树,根,右子树后序:左子树,右子树,根N代表空元素前序 1 2 3 N N N 4 5 N N 6 N N中序 N 3 N 2 N 1 N 5 N 4 N 6 N后序 N N 3 N 2 N N 5 N N 6 4 1层序 1 2 4 3 5 6一层层从左到右一个树分成根和子树,子树再分为根和子树。
2024-05-05 22:41:12
767
10
原创 【数据结构】二叉树-堆
树是一种的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次的关系的集合。注意:子树不能相交树的拆分为根,n棵子树(n>=0)然后继续在n棵子树里面继续拆分根,n棵子树,一直拆分到叶节点A为根D,F为子树D为根,H为子树F为根,K,L,M为子树。
2024-04-26 16:53:09
963
3
原创 【数据结构】栈
一种特殊的线性表其只允许在进行插入和删除元素操作。进行数据插入和删除操作的一端称为,另一端称为。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
2024-04-08 19:30:16
320
2
原创 LeetCode--练习题(顺序表链表)
思路很简单主要是对中间节点的寻找和对中间节点以后的链表进行逆置然后比较大小。思考:如果slow走一步,fast走三步,一定会相遇吗?因为时间复杂度太大,导致运行时间超载,不建议使用这个思路。上面是我自己写的代码过于冗余,下面的会好很多。时间复杂度O(n),空间复杂度O(1)时间复杂度O(n)空间复杂度O(n)时间复杂度O(n)空间复杂度O(1)时间复杂度O(n)空间复杂度O(1)下面的代码我就不写全就用函数调用来表示。再使用快慢指针的时候一定要注意。
2024-04-07 11:32:11
326
1
原创 C语言-贪吃蛇
GetStdHandle是用于获取一个特定设备的句柄,可以这么理解,在VS2022所打开文件的控制台都是特定的设备,若新建一个文件在新的文件编写代码所打开的控制台就和上一个控制台不一样。
2024-03-30 15:47:37
1057
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人