自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C/C++、数据结构、Linux....

坚持,坚持,再坚持!!!

  • 博客(46)
  • 收藏
  • 关注

原创 【Linux】可重入函数 && volatile && SIGHLD信号

• main函数调用insert函数向⼀个链表head中插⼊节点node1,插入操作分为两步,刚做完第⼀步的时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到 sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插⼊操作的两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续往下执行,先前做第⼀步之后被打断,现在继续做完第⼆步。结果是,main函数和sighandle

2025-06-05 19:00:00 922

原创 【Linux】进程 信号保存 && 信号处理 && OS用户态/内核态

1. OS有巨大的 中断向量表,在开机的时候 从外设 直接 拷贝到 内存 当中了,包括 系统调用表【函数方法】和 各种异常处理方法 和 OS 内的各种数据结构,2. OS --- 其中 OS 内 不管是 系统调用、各种异常处理方法、打开文件、调度进程... 本质都是 通过系统调用方法 去访问 OS 里面的各种数据结构,把数据结构的操作方法 以函数的方式 提供出来,最后把 所有函数包装成 系统调用,让外部就能以硬件或软件中断的方式去调用。3. Linux 操作系统 让 每一个进程 都有自己的

2025-06-04 22:08:54 924

原创 【Linux】进程 信号的产生

​• 键盘上的组合键 是先被OS系统识别到【OS是键盘真正的管理者,当系统在运行的时候,OS一直在检测键盘上有没有信息】再发给进程,当进程不能立即处理这个信号时,进程就会记录下这个信号【信号是从 1-31 连续的数字,进程是否收到1-31这个数字的信号 --- 在 task_struct 里通过位图记录 0000 0000 0000 0000 0000 0000 0000 0000,比特位的位置:信号的编号,比特位的内容:是否为0/1,是否收到对应的信号】,发送信号的本质是什么?【写入信号】OS修改目标进

2025-05-25 19:30:00 1663

原创 【Linux】了解 消息队列 && system V信号量 && IPC原理

操作系统内部提供一个队列queue,操作系统里面的数据和相关的数据结构,是可以被所有进程共享的,两个进程【进程A,进程B】,操作系统给这两个将要通信的进程提供一个队列【在操作系统维护的队列】和数据块【struct data】,用户上层定义一个struct data的对象,进程A 想发给 进程B,把 struct data的对象 通过系统调用,把这个对象放入到操作系统的队列当中,这个队列进程A和进程B都能看到,进程A向这个queue里放节点,进程B就可以从queue里面拿节点 ---- 消息队列。进程B也可以

2025-05-21 19:54:39 976

原创 【Linux】共享内存

本文详细介绍了共享内存的概念、实现方式及其在进程间通信中的应用。共享内存通过系统调用shmget创建,并使用shmat将其映射到进程的虚拟地址空间,从而实现多个进程访问同一块物理内存。文章还探讨了共享内存的管理指令(如ipcs和ipcrm)以及相关函数(如shmctl和shmdt)的使用方法。共享内存的优点是通信速度快,但缺乏保护机制,需通过信号量等方式进行同步。最后,文章通过代码示例展示了如何在客户端和服务器端使用共享内存进行通信,并提供了Makefile和头文件的实现细节。

2025-05-17 19:17:30 799

原创 【Linux】进程通信 && 管道

每一个进程都有自己对应的文件描述符表,【struct files_struct 进程和文件所对应的映射关系,严格来讲属于偏进程方面的,若要创建子进程就要创建它】里面有一个数组【fd_array[]】数组对应都有自己的下标,在进程的内部有指针指向自己的文件描述符表,当进程打开磁盘文件【文件 = 内容 + 属性】,找到inode和文件的映射关系,在内核当中就可以创建一个所对应的内核数据结构【struct file 】,里面包含有文件相关的属性集【inode 和 文件内核缓冲区】,文件的属性就可以放到inode里

2025-05-13 21:58:13 908

原创 【Linux】静态库 && 动态库

动静态也是文件也有自己的inode编号,在执行程序./main,程序加载到内存里面【二进制】,内存 ---页表 --- 进程 形成映射关系,可执行程序知道自己依赖哪些库,动态库也会加载到内存里面,新加载的库 --- 页表 --- 进程 形成映射,映射到进程的虚拟地址空间的共享区,当代码在编译时,需要调库就直接跳转到共享区执行所对应的方法,执行完再返回正文代码中,因此整个进程执行库方法,全都是在自己的地址空间中跳转运行的。【将当前所在的库路径添加到环境变量列表当中】库是写好的现有的,成熟的,可以复⽤的代码。

2025-04-22 20:00:00 802

原创 【Linux】文件系统 && 软硬连接

首先要确定在哪一个组里面,操作系统由文件系统自动来进行确定, 遍历GDT去找,根据要新增文件的基本信息【新增文件的大小、文件名称、...】找到了对应的一个组,其中就要分配inode号,首先查位图,找到一个局部性的值【偏移量】,把inode Bitmap、Block Bitmap。

2025-04-17 22:00:00 896

原创 [刷题总结] 二分查找 && 前缀和

目录一、二分查找1.题目:704. 二分查找 - 力扣(LeetCode) 2.题目:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)3.题目:35. 搜索插入位置 - 力扣(LeetCode)4.题目:69. x 的平方根 - 力扣(LeetCode)5.题目:153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)6.题目:LCR 173. 点名 - 力扣(LeetCode)二、前缀和1.题目:【模板】前缀和_牛客题霸_牛客网2.题目:【模板】二维前缀和_牛客题

2025-04-11 00:58:52 658

原创 [刷题总结] 双指针 && 滑动窗口

使得[0 , left]的这个区间全部都是非零的区间;这种类型的题,⼀般就是使⽤「双指针」来解决。常用:慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢。• 使用两个移动速度不同的指针在数组或链表等序列结构上移动。先根据“异地”操作,然后优化成双指针下的“就地”操作。<1> 先找到最后一个“复写”的数(模拟一遍往后)• 决定 dest 向后移动一步或者两步。• 先判断 cur 位置的值。• 终止条件:两个指针相遇或错开。(1)异地求解(新开数组)• 从两端向中间移动。(2)双指针(原地)

2025-04-06 21:14:52 844

原创 数据结构 && 常见的排序算法

直接插入排序。

2025-03-06 20:23:40 303

原创 【Linux】文件 && 文件描述符fd

一、C文件接口一、C文件接口🌟写文件🌠小贴士:• 文件 = 内容 +属性• 访问文件之前,都必须先打开它!【把文件加载到内存当中】文件没有被打开的时候,是在磁盘上的,我们在访问文件的时候,是谁在访问?写完的代码只是一个文本,并没有打开,代码编译成可执行程序【二进制】,也不是打开文件,当程序运行时,执行到fopen,并执行成功,才算是文件被打开。fopen属于运行时操作,当程序跑起来的时候,执行完fopen,对应的文件才会被打开。即访问一个文件,实则是进程在访问!• 文件必须加载到内存中!

2025-01-10 11:12:40 1021

原创 【Linux】编写简易shell && 深度理解命令行解释器 && 环境变量 && 内建命令

1、在命令行中,一个命令是如何执行的?对于普通命令来讲,就是解析命令行,然后通过exec*系列的函数接口,进行fork()程序替换。2、命令行参数是从命令行依次获取的,被shell自己解析自己维护。3、环境变量表是从系统的配置文件读取出来的,由shell自己维护,维护好就是一个全局的指针数组,通过 execvpe() 接口函数来调用,这个系统的调用接口把环境变量传递给所有的子进程。4、echo命令,是内建命令。

2024-12-26 21:32:41 1013

原创 【Linux】进程控制 && 程序替换

🌻返回值:当正常返回的时候waitpid返回收集到的子进程的进程ID;如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;🌻参数:pid• pid > 0:等待成功,目标为子进程的pid;• pid == 0:等待成功,但是子进程没有退出;• pid = -1:等待失败,等待任一个子进程。与wait等效。🌻status:•WIFEXITED

2024-12-21 20:43:09 834

原创 【Linux】环境变量 && 程序地址空间

🌻🌠命令行参数:我们使用的所有指令是用C语言或者是其他语言写的,指令中的选项是通过命令行参数来实现的,命令行参数列表使得同一个程序,可以根据命令行参数,根据选项的不同,表现出不同的功能。比如:指令中选项的实现!• main 函数的参数是谁传递的?这个字符串首先是被命令行解释器(shell)【进程】拿到的,shell 拿到之后,首先把上面的命令按照空格打散,形成一张表(argv)和元素个数(argc)。命令行启动的程序,父进程都是shell,所以命令和shell命令行是父子关系。

2024-12-15 21:30:00 808

原创 【Linux】进程

进程 = 内核数据结构(task_struct)+ 程序的代码和数据运行起来的程序,进程会被根据task_struct属性 被OS调度器调度,运行为什么要有PCB(task_struct)? OS要管理进程,先描述,再组织。task_struct 是Linux内核的一种数据结构,它会被操作系统在内存中进行创建,里面包含着进程相关的管理信息。

2024-12-06 21:30:19 744

原创 【Linux】gdb / cgdb 调试 + 进度条

所以为什么上面程序为什么会多出一个 “0” ,也就能理解了,以为从 10 开始我们输出的是 “1” “0” ,紧接着要输出 “9” 时,光标回车到了最开始,只覆盖住了 “1” ,“0” 一直都在,所以我们需要修改输出的格式 printf("%-2d\n",countt);我们思考一下,我们给显示器输出的是一个整数1234,还是打印了一个1 2 3 4 字符,让我们以为打印的是一个整数,我们需要知道的是,在平时我们都会以为这两个使用是一样的,其实不然,新起一行的本质:先回车,再换行。

2024-12-01 21:30:18 1110

原创 【Linux】vim

vim常见模式:•正常/普通/命令模式(Normal mode)控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode•插入模式(Insert mode)只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。•末行模式(last line mode)文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即

2024-11-25 21:30:00 2405

原创 【Linux】权限

用户1 新建了一个文件,但是不想让 other 进行读/写,为此 用户1 把这些权限给关掉了,其他用户就不能对 用户1 建的文件进行读/写,但是其他用户可以对 用户1 建的文件进行删除!(文件的拥有者是当前用户)更改文件的读写执行权限,只会更改该文件本身,但要修改文件的拥有者、所属组时,普通用户以拥有者为例,本质是你要把这个文件给别人,给别人要经过别人的允许,若非要给,需用。一个文件被新建/删除/更改,并不取决于这个文件本身的读写执行权限,而是取决于这个文件所在的目录的权限;新建一个普通文件是664?

2024-11-22 21:09:36 930

原创 【Linux】基本指令

语法: ls [选项] [目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文件的详细信息-r 对目录反向排序-t 以时间排序-s 在l文件名后输出该文件

2024-11-21 22:00:00 1019

原创 智能指针(内存泄漏问题)

借此,我们实际上把管理一份资源的责任托管给了一个对象。这种方法有两大好处:• 不需要显式的释放资源;• 采用这种方式,对象所需的资源在其生命期内始终保持有效。

2024-11-01 22:00:00 1086

原创 C++11特性

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用列表初始化时,可添加等号(=),也可不添加:创建对象也可以使用列表初始化方式调用构造函数初始化

2024-10-26 22:00:00 674

原创 unordered_map 和 unordered_set 的模拟实现

🌻本篇文章,重点是:和模拟实现是如何进行封装的,封装的细节需要注意哪些,注意看仔细哦~

2024-10-25 21:26:57 956

原创 哈希表【闭散列/开散列】

1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。4. unordered_map容器通过key访问单个元素要比map快,

2024-10-24 21:55:00 997

原创 红黑树的实现

为了后续实现关联式容器简单,红黑树的实现中增加一个头结点,因为根节点必须为黑色,为了 与根节点进行区分,将头结点给成黑色,并且让头结点的 pParent 域指向红黑树的根节点,pLeft 域指向红黑树中最小的节点,_pRight域指向红黑树中最大的节点。,红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以红黑树在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用红黑树更多。注:此处看到的树,有可能是一颗完整的树,也可能是一颗子树。

2024-10-07 20:19:06 734 1

原创 AVL树的实现

从上面的左单旋、右单旋,我们可以知道,插入的节点都是偏向同一边的(left->left、right->right),如果我们插入的节点不在同一侧呢?这里的平衡因子,并不是实现AVL树的,唯一方式,有一些会直接去看高度差来进行控制,但是我们这里采用的是平衡因子。• 进行旋转完后,最重要的是维护好平衡因子,情况一和情况二的区别就是旋转后平衡因子的变化不一样。• 进行旋转完后,最重要的是维护好平衡因子,情况一和情况二的区别就是旋转后平衡因子的变化不一样。• parent所在的子树高度都会变化,需要继续往上更新;

2024-10-06 22:30:00 887

原创 【C++】树形结构的关联式容器:set、map、multiset、multimap的使用

set的介绍1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2024-10-02 22:00:00 1251

原创 二叉搜索树的实现 K模型 和 KV模型

• 对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。搜索二叉树的节点不仅要存该节点的值,还要存左右节点的指针,因此把节点封装成一个节点类,以便对节点插入、删除、查找等进行操作。KV模型:每一个关键码key,都有与之对应的值value,即的键值对。• 找到位置,创建节点,并判断节点是插入在前一个节点的左边还是右边。• 在插入时,树为空,新建的节点要存value;

2024-09-28 21:56:41 844

原创 【C++】多态and多态原理

🌟多态的构成条件多态是在不同关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。在继承中构成多态的两个条件(指向谁调用谁)1、必须通过基类的指针或者引用调用虚函数;2、被调用的函数必须是虚函数(对象都不行),且派生类必须对基类的虚函数进行重写;🌟虚函数即 被virtual修饰的类成员函数称为虚函数。class Apublic:🌟虚函数的重写。

2024-09-15 22:30:00 1140

原创 【C++】继承

🌟继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。之前我们接触的复用都是函数复用,继承是类设计层次的复用。//学号protected:int _jobid;//工号Student s;Teacher t;s.Print();

2024-09-06 22:30:00 992

原创 【C++】模板特化

2. 模板定义的位置显式实例化。四、模板总结。

2024-09-04 22:30:00 2297

原创 【C++】stack、queue、priority_queue的模拟实现

2、队长被实现为容器适配器,这些类使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函数来访问其元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。底层是一个堆,在堆后中插入数据,数据就乱了,因此要向上调整堆的数据。

2024-09-02 17:20:36 1158 1

原创 【C++】list的使用和list的模拟实现和迭代器失效问题

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-08-28 22:00:00 961

原创 【C++】vector的模拟实现

• erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。• 出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。

2024-07-29 15:40:05 1046

原创 【C++】vector的使用

Vector是表示大小可以改变的数组的序列容器。与数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的效率一样高。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。在内部,vector使用动态分配的数组来存储它们的元素。当插入新元素时,可能需要重新分配此数组以增加大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一项相对昂贵的任务,因此,vector不会在每次将元素添加到容器时重新分配。

2024-07-28 13:38:22 922

原创 【C++】 string类的模拟实现

这里我们给字符数组分配一个空间大小来储存\0,同时设置类的_size和_capacity成员变量的初始值。一些细节:以上涉及到相关的接口实现往接着下看😊用常量字符串:_str(new char[strlen(str) + 1])//+1给末尾存储\0//用字符串函数将常量字符串拷贝到对象的数组中我们可以对代码进行优化,可以将上述两个函数通过缺省值合并为一个函数。// +1是给末尾存储\0//用字符串函数将常量字符串拷贝到对象的数值中。

2024-07-20 13:31:51 980

原创 【C++】 string类的常用接口类型的使用

在使用string类时,必须包含#include头文件以及using namespace std;string 是表示字符串的字符串类;该类的接口与常规容器的接口基本相同,再添加一些专门用来操作string的常规操作;string在底层实际是:basic_string模板类的别名,不能操作多字节或者变长字符的序列。

2024-07-15 12:55:13 1132

原创 【C++】初识模板 (函数模板和类模板)

class 类模板名//类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)

2024-05-28 21:39:26 576

原创 【C/C++】内存管理

int main()自定义类型,new才会调用构造初始化,malloc不再适用开空间/释放空间,还会调用构造和析构delete p2;delete p3;return 0;在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc 和 free不会。

2024-05-17 21:50:41 1828 1

原创 【C++】类和对象(下)构造函数、static成员、友元、内部类、匿名类)

3。

2024-05-13 21:55:21 2064 8

空空如也

空空如也

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

TA关注的人

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