自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 Linux动静态库

我们一直在使用C/C++的库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库 .a[Linux]、.lib[windows]动态库 .so[Linux]、.dll[windows]

2025-06-16 12:59:37 630

原创 揭秘文件系统

我们发现我们将code和code-soft软连接后,将hello写入code.c,发现code-soft内容也同步发生变化我们再来看它们的inode,发现inode并不一样,所以软链接是一个独立的文件,因为它有独立的inode软连接能干什么?我们把可执行程序放到很复杂的目录里,我们想找到可能就不太容易了,但是如果我们直接用软连接,执行软连接程序就相当于执行我们的可执行程序。软连接就相当于Windows下的快捷方式那么软连接的内容放什么?软连接的内容保存目标文件的路径。

2025-06-15 11:08:59 766

原创 重定向与缓冲区:C语言IO的奥秘(模拟封装glibc)

缓冲区就相当于我们现在的菜鸟驿站,别人给你寄快递的时候,你当前可能有事,来不及处理这个包裹,所以快递员就把你的包裹放到了楼下的菜鸟驿站中,给你缓冲起来,将来你取快递,只要去菜鸟驿站取就可以了。更重要的是,如果你是快递员,你今天去打电话送快递,但是这个人根本就不在,那么你就只能等,等待的过程过长,今天就发不了几个快递,但是有菜鸟驿站就不一样了,它就不需要等任何人,只要把包裹放到菜鸟驿站就可以了,提高了快递员的快递效率,也方便了用户。快递员就是操作系统,你就是用户,而菜鸟驿站就算是缓冲区。

2025-06-13 21:32:33 1128

原创 基础I/O

首先进行命令行分析 "ls -a -l > file.txt"我们要将其分为两部分" ls -a -l" 和 " file.txt"左半部分是要执行的命令,右半部分是打开的文件然后判断符合是> | < | >> 判定重定向方式我们设置全局变量,来记录重定向的方式,和打开的文件每一次执行命令前都要清空redir,让其恢复默认值NONE_REDIR我们从后向前找重定向符号,然后执行不同的逻辑我们还需要将>右侧的空格符号给去掉,就用TrimSpace函数在不同的符号,改变redir的值。

2025-06-13 10:13:38 563

原创 掌握Linux进程替换:从原理到实战(自定义shell)

我们可以用printf直接打印出,命令行提示符,但是这样太固定了,我们有没有方法直接获取用户名和主机名以及路径呢?getenv,用户名主机名等都存在环境变量中,我们可以调用getenv获取对应的变量snprintf就是把格式化的可变内容往字符串中输出除此之外,我们这样获得的pwd是一个绝对路径,在提示符中太长了,我们想只要显示当前目录的名称那就只能做切割字符串,路径都是以/来分割的,要么只要一个/表示根目录,要么就是一堆路径用/分割,这种情况,我们只需要最后一个/后的内容。

2025-06-11 21:28:58 964

原创 Linux进程管理:创建,终止,等待

第二种,这种场景是我们创建一个子进程,但我期望我的子进程帮我执行全新的程序,比如说我们在命令行中执行我们对应的命令,我们已经验证过了,我们所输入的命令本质上就是一个进程,而一旦它变成一个进程后,它的父进程就是bash,相当于我们输入命令时,是bash创建了子进程,但是这个子进程不是为了执行bash的,而是我们新启动的命令或者程序的。换句话说,我们看起来语言上的调用的是exit,但实际上语言上的exit也会调用系统中的_exit,因为库函数没有终止进程的能力,它只有调用系统给它的接口,才能完成终止进程。

2025-06-11 10:34:00 1148

原创 程序地址空间

当我们开辟堆空间,让后将堆空间给释放了,然后会将其页表中的内容给删去,那么你对一个已释放的内存进行访问时,页表就不存在该内存的映射关系,所以查页表就会失败,操作系统就会把你的进程杀掉,于是进程就可能崩溃当我们执行如下代码时,运行时会崩溃。

2025-06-10 13:03:52 838

原创 揭秘环境变量:系统运行的幕后功臣

环境变量(environment variables)一般是指在操作系统中⽤来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

2025-06-09 16:34:35 780

原创 进程优先级

其中CPU还有负载和切换次数的两个参数,就是cpu_load,nr_switch,如果有两个CPU,当新来一个进程肯定要分配给,较为闲置的那个CPU,因为这样才能平均分配资源,不能出现一个很忙的cpu,一个很闲的cpu。我们当代Linux或其他大多数的操作系统,都是基于时间片的分时操作系统,而这一类操作系统有一个特点,必须考虑一定的公平性,虽然进程有先有后,但是差别不能过大,即优先级的数据范围不能太大,如果优先级差别过大,会导致某些优先级低的进程得到资源太晚了,因此。

2025-06-08 17:59:00 620

原创 揭秘进程状态

当键盘按下,相当于硬件就绪,操作系统作为硬件的管理者,硬件状态发生变化,操作系统会第一时间知道,OS就会去查看该硬件对应的节点,将状态设为活跃状态,并检查等待队列,发现等待队列指针不为空,就将等待队列中的进程状态由阻塞改为运行,重新链入到调度队列中,等待CPU调度。如果不领养,就说明子进程没有父进程,子进程一旦退出就没人关心他了,就变成了僵尸进程,在操作系统能处理子进程的就两个人,一个是子进程的父进程,一个是系统,所以如果不领养,就会造成内存泄漏无法解决,因此需要领养子进程,对子进程进行统一回收。

2025-06-08 14:43:08 1116

原创 冯诺依曼体系,操作系统,进程的基本概念

我们的计算机是以硬件构成的,硬件包括显示器,键盘,鼠标,显卡,网卡,磁盘或者更多见不到的硬件设备,不过不管你的硬件设备有多少,它都不是杂乱无序的,不是直接揉在一起就能组成计算机的,所有的计算机都是按照一定的组织结构划分在一起的,而我们当前的计算机最常见的体系结构就是。实际上,我们的计算机中有很多的存储设备,离CPU最近的是寄存器,也有各种的cache缓冲,我们会发现在存储中,离CPU越近,他的存储能力越小,但是他很快,也很贵,而离CPU越远,存储能力越大,但是它很慢,价格很便宜。

2025-06-07 15:34:18 773

原创 Git与GDB:程序员必备的版本控制与调试技巧

我们继续来延展上面的故事,李四将各个版本的报告都存在了自己的磁盘中,想到不止自己会遇到这个问题,其他人也会遇到同样的问题,因此李四直接宣传了自己,需要版本控制的可以找它,然后就有王五赵六等等,去联系李四,然后李四就把本校同学的实验报告就管理起来了,以后王五想要自己的几号版本文件,直接给李四说,就能取到对应版本的报告。如上图,一个公司建立了一个项目,项目中有三个文件,让abc三个程序员,每一个程序把此项目仓库同步到自己的本地,a把第一模块完成,b完成第二模块,c完成第三模块,然后同步对应的文件推送到远端。

2025-06-06 10:26:00 604

原创 揭秘Makefile:高效编译的神器

在Makefile中可以直接定义变量直接变量名:(或者 =)值然后用 $(变量) 来引用变量,就像是c语言中的指针解引用我们发现当我们执行make时,会把对应的命令回显出来,如果我们不想回显,可以在命令前加@符号那么可以定义变量后,我们就可以多定义几个变量,然后修改makefile文件,使makefile文件中,代码不用出现变量名字,如下图相当于变量替换,这样我们如果有新的文件,比如叫myprocess.c,只要修改定义变量,就能直接运行,不用再修改文件后面的代码但是这个还是有些麻烦。

2025-06-05 15:36:50 785

原创 Linux开发工具(apt,vim,gcc)

那么问题就来了,你说包管理器类似于我们手机的应用商店,那么我们在手机上下载的抖音,是字节跳动公司提供的,人用的多,他们才能盈利,所以他们提供。那。

2025-06-04 15:26:56 1449 1

原创 解密Linux权限管理:从入门到精通

有些公司有赛马制度,即让两个小组,都去完成同一个项目,进行内部竞争,谁先做出的项目并获得认可,那么公司就会推举这个项目。如果这个公司只有一台服务器,那么两个小组 会分别建立一个目录,来完成自己组的项目而如果你写了一个项目文件code.c ,如果你的领导要看你的代码,假设没有所属组这个角色,那么,作为文件拥有者的你,只能放开other的权限,那么此时B组的成员也能查看你所写的代码,这个就不太合理,因此增加了一个所属组的角色,完成更精细化的权限管理。

2025-05-29 13:50:42 1096

原创 Linux的基本指令

首先先阐述一个基本概念如图,当我们输入一条指令时,ls是,而ls后面的-a -l是,也可以直接连起来写,并且不分先后顺序,比如ls -a -l 和 ls -al 的效果是一样的这个先做了解即可,在后面的章节,我们会详细论述。

2025-05-28 15:52:41 916

原创 [C++]vector(超详细)

在学习完了string后,我们来学习新的STL容器vector,是真正的属于STL中的一员,vector也是STL的基础容器,英文释义是向量,其实实质上就是顺序表。在这个部分我们会学习的非常快,第一个原因是由于vector的设计更加简单,第二个原因是因为string和vector都是数组类型的,我们学会了string,这个就信手拈来了。

2025-01-03 20:58:44 1618

原创 [C++]string(下)(模拟实现,引用计数)

我们在上半部分,简单的讲述了一下string类的具体用法,我们本节就从底层模拟实现string,能够更加清晰的学习string的底层。

2024-12-31 11:42:37 1137

原创 [C++]string(上)(string具体用法)

STL(Standard Template Library)标准模板库是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL也是C语言和C++的重大区分之一,有了STL,C++就不用再手动的实现顺序表,链表,哈希表等等的数据结构,而C语言还必须手动实现,十分的繁琐STL的六大组件:STL需要我们在实践中不断的使用,不断的积累才能渐渐的掌握。我们下面将学习几个STL中重要的数据结构。

2024-12-29 16:43:20 978

原创 [C++]模板初阶

class 类模板名// 类内成员定义我们实现栈,来演示一些类模板的作用public:,_size(0){}~Stack()//扩容情况,我们怎么办呢?C语言中可以用realloc,C++有renew吗?//答案是没有的//我们需要做下面的操作,C++中如果我们手动实现顺序表这类的数据结构,都需要自己手动扩容//但是因为C++有STL的原因,我们一般并不需要自己实现,//...private:T* _array;

2024-12-28 15:26:09 965

原创 [C++]内存管理

除此之外,C++中new关键字还可以帮助我们完成初始化,如下所示这样一看从用法上来说,非常的方便,但是要注意必须要给值才会初始化,像上面的ptr1是不会初始化的,必须要给值,像p3这样就会初始化。c++中new和delete与c的真正区别在于,在申请空间时,对于自定义类型会自动调用其构造函数和析构函数new一个对象会自动调用其对应构造函数,即按照所给的变量个数匹配构造函数,无参构造,一个参数的构造,拷贝构造等。int main()//拷贝构造//匿名类 拷贝构造。

2024-12-28 10:39:23 783

原创 [C++]类和对象(下)

我们紧接着上一章的部分进行讲解。

2024-09-17 12:06:25 967

原创 [C++]类和对象(上)

目录1.类的定义1.类定义的格式2.访问限定符3.类域2.实例化1.实例化的概念2.实例化的对象大小3.this指针3.类的默认成员函数1.构造函数2.析构函数3.拷贝构造函数类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义的引用数据类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。我们这里以栈Stack为例,创建一个名为Stack的类,再来实现其的基本用法。

2024-09-16 11:17:14 1297

原创 [数据结构]二叉搜索树

今天我们来学习一下新的数据结构,二叉搜索树,这个结构比较简单,是一个铺垫式的结构,为之后的平衡二叉树,AVL树以及红黑树做一个知识基础,我们将从概念到实现具体的介绍二叉搜索树。

2024-09-15 11:59:30 1122

原创 [排序]归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。我们先看一下归并排序的动态图。

2024-07-24 11:40:17 899

原创 [排序]快速排序——前后指针法(含非递归实现快排)

上一章我们具体介绍了hoare快速排序的具体实现,本篇我们将介绍快速排序的前后指针法来实现,与hoare快排的排序算法逻辑相似大同小异,本章我们还会实现非递归实现快速排序,希望能帮助到大家。

2024-07-23 13:10:42 834

原创 [排序]hoare快速排序

今天我们继续来讲排序部分,顾名思义,快速排序是一种特别高效的排序方法,在C语言中qsort函数,底层便是用快排所实现的,快排适用于各个项目中,特别的实用,下面我们就由浅入深的全面刨析快速排序。事先声明,快速排序有不同的版本,今天我们讲的是hoare的版本目录快排的定义hoare快排的具体实现快排的时间复杂度优化快速排序三数取中小区间优化相遇位置比key小的问题快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割

2024-07-22 20:50:44 1098

原创 [C++]入门基础(2)

引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。引用的使用即类型& 引用别名 = 引用对象注意:C++中为了避免引入太多的运算符,会复用C语言的⼀些符号,比如前前的<< 和 >>,这里引用也和取地址使用了同⼀个符号&。大家一定要分清楚用法,不要混淆了!我们可以通过一个代码更为清晰的了解,引用和变量的关系。

2024-07-14 20:01:15 802

原创 [C++]入门基础(1)

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。如图所示,我们自己创建了一个命名空间lmd,里面可以放变量,函数,以及创建的结构体类型namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。我们可以试着解决一下,刚才函数名和变量名冲突的问题很显然这个问题以及解决了。

2024-07-08 22:06:16 869 1

原创 【排序】插入排序,希尔排序

以上是对插入排序和希尔排序的分析,是一种新的排序思想,其中的种种知识点也很碎很多,希望大家能够有所收获。

2024-06-04 13:27:26 965 4

原创 【排序】选择排序(含优化版)

冒泡排序的时间复杂度为O(n^2),其中n是要排序的元素数量。这是因为冒泡排序需要进行多次遍历,每次遍历都需要比较和交换元素。因此,对于大规模数据的排序,冒泡排序可能不是最有效的选择。选择排序的时间复杂度也是O(n^2),但它的性能通常优于冒泡排序。因为选择排序只需要进行一次遍历,并且只需要进行一次比较和交换操作。因此,在处理大规模数据时,选择排序通常更为高效。但如果遇到已经排好序的数据,冒泡排序只需要循环一次就能发现,并终止,但选择排序却需要继续遍历数组,在这一点上选择排序的效率是不如冒泡排序的。

2024-06-02 12:20:30 1508 3

原创 【排序】冒泡排序

在我们的生活中,到处都离不开排序的作用,考试分数要排序,商场购物要排序,可以说排序对我们来说处处存在,那么从本章开始,我将要依次分享一些排序方法,从易到难,包括冒泡,插入,快速,希尔,选择等排序方法,希望大家能够支持。

2024-05-31 12:03:11 739 1

原创 数据结构——二叉树的基本应用

二叉树的基本应用,还是比较复杂的,大多要使用递归实现,个别还需要用到队列的知识,因此我们需要掌握递归的原理,若不理解递归过程,可以通过画递归展开图的方式去理解,一定要将每一个函数接口给理解清楚,此类问题需要我们不断的练习和复习,才能将二叉树的知识巩固住,希望本篇文章能够帮助到你。

2024-05-28 20:37:16 1449 4

原创 二叉树基础OJ题目

二叉树的基本问题,很多都是利用递归原理去实现的,这个是双路递归,即进行两个方向的递归,我们需要清楚的理解递归逻辑,如果无法理解递归,那么就花一些时间,画出递归的展开图去理解,多次下来就能提高对递归的认识,与此同时,要及时的去复习和巩固。

2024-05-24 10:39:11 841 5

原创 数据结构——堆的时间复杂度推导及topk问题

本篇文章,我们推到了向下调整建堆算法和向上调整建堆的时间复杂度,还有堆的topk问题,我们从逻辑方面,用数学公式详细的介绍了算法时间复杂度,希望本篇文章能帮助到正在努力的你。2%5E0&plus;2%5E1&plus;2%5E2&plus;...&plus;2%5E2&plus;...&plus;

2024-05-21 15:40:02 1593 2

原创 数据结构——(完全二叉树)堆

本章我们介绍了树的基本概念,二叉树,堆的实现,以及最重要的堆排序,向上调整算法,向下调整算法。我很清楚进入树的领域后,数据结构的难度会骤然上升,不过如果不挑战自己,又怎能进步呢,路漫漫其修远兮,吾将上下而求索,希望这篇文章能帮助到你,共同进步!

2024-05-16 21:04:43 1167 2

原创 数据结构——栈和队列的互相实现

这两道题目的代码实现都不难,由于我们有直接的函数可以使用,重点在于逻辑的设计。两道题的核心就在于用两个对象来实现相互的基本用法,而重点都在于删除数据,这需要我们认真的思考,去吸收这个思路,便于在以后遇到类似题目时想到这类方法,尤其是第二道题的第二个思路,希望这篇文章能够帮助到你!

2024-05-13 17:47:30 1052 2

原创 数据结构——队列(附环形队列问题)

以上就是队列的基本用法和环形链表的实现,相对来说并不难,逻辑和代码的实现都比较清晰简单,希望大家能够掌握队列的知识。

2024-05-11 16:08:46 1048 5

原创 栈的基本用法

总体来说,栈的实现是比较简单的,相比于之前的单链表和双向链表,由于栈是由顺序表实现,所以我们感觉更为简单,总而言之,如果你的顺序表掌握的不错,那么栈你一定可以理解,希望这篇文章对你有所帮助!

2024-05-10 15:00:33 707

原创 数据结构——顺序表

顺序表的实现,相对容易,代码和逻辑都比较简单,这只是数据结构的基础,希望这篇文章可以让你清晰的掌握顺序表的结构与逻辑!

2024-05-08 14:39:26 1195 1

765797782556029Apk Extractor.apk

765797782556029Apk Extractor.apk

2023-10-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除