- 博客(82)
- 收藏
- 关注
原创 Linux操作系统--进程间通信(system V共享内存)
本文介绍System V共享内存,涉及其无同步互斥机制、速度快及用户维护数据特点,阐述相关数据结构、函数,附实例代码及日志模块说明。
2025-05-16 23:20:57
1036
原创 Linux操作系统--进程间通信(中)(命名管道)
这篇文章主要介绍了命名管道(FIFO)的概念以及使用方法。命名管道是一种特殊类型的文件,可以在毫不相关的进程之间进行进程间通信。文章中提到了命名管道的创建方法,以及与匿名管道的区别,主要区别在于创建和打开方式。此外,还介绍了命名管道的使用规则和一些示例代码,包括通过命名管道实现文件拷贝和实现server & client通信。在示例代码中,展示了如何创建命名管道、打开文件、读取、写入数据等操作。还展示了具体的server和client通信代码实现,以及日志记录和输出的相关内容。整体来说,文章详细介绍了命
2025-05-03 20:31:15
628
原创 Linux操作系统--进程间通信(上)(进程间通信的目的、匿名管道)
本文介绍了进程间通信的目的,包括数据传输、资源共享、通知事件和进程控制。然后详细讨论了进程间通信的发展历程和分类,包括匿名管道、命名管道、System V消息队列、共享内存和信号量等。文章通过示例代码和原理讲解了管道的使用和工作原理,包括匿名管道、fork共享管道、文件描述符角度理解管道、内核角度理解管道等方面。最后总结了管道的特点,如具有血缘关系的进程进行通信、单向通信、面向字节流、基于文件、半双工等特点。
2025-05-01 23:23:54
650
原创 Linux操作系统--基础IO(下)(重定向、缓冲区、理解文件系统)
这段代码展示了一个名为_IO_FILE的结构体,包含了与文件I/O相关的各种成员变量。这些成员变量包括状态标志、读写缓冲区的位置指针和边界指针、关联的文件描述符等。结构体_IO_FILE用于在C语言中表示文件流,其中的成员变量用于管理文件读写操作的状态和数据缓冲。
2025-04-27 23:46:18
807
原创 Linux操作系统--基础I/O(上)
本文总结了C文件接口和系统文件I/O的基本操作。首先介绍了使用C标准库函数进行文件读写操作的示例代码,包括使用fopen、fwrite、fread等函数来进行文件操作,并展示了如何将信息输出到显示器上。接着介绍了使用系统调用接口进行文件读写操作的示例代码,包括使用open、read、write等函数来进行文件操作,以及如何处理文件描述符和文件打开错误。文章还强调了库函数和系统调用接口的区别,以及文件描述符的概念和标准输入输出错误的默认文件描述符。
2025-04-24 23:24:52
1007
原创 Linux操作系统--进程程序替换and做一个简单的shell
这篇文章介绍了关于`execve`系统调用的原理和使用方法,以及通过示例代码展示了如何使用`exec`系列函数来加载并运行新程序,替换当前进程的内容。文章还展示了如何结合前面讨论的知识制作一个简易的shell程序,包括命令交互、命令解析、内建命令的处理和普通命令的执行等功能。整个过程涵盖了系统调用、进程管理、环境变量操作等内容,旨在帮助读者理解系统编程中的一些核心概念和技术。
2025-04-22 20:19:06
414
原创 Linux操作系统--进程等待
文章的摘要包括了进程等待的必要性、进程等待的方法(包括wait方法和waitpid方法)、获取子进程status的方式,并给出了相关的代码示例。wait和waitpid是系统调用接口,用于等待子进程状态变化。在代码示例中,展示了如何使用wait和waitpid来等待子进程的结束,并获取子进程的退出状态信息。通过该摘要,读者可以了解到进程等待的作用和实现方式。
2025-04-21 13:35:27
1017
原创 Linux操作系统--进程的创建和终止
调度器的主要作用是根据不同的调度算法,决定哪个进程可以获得CPU时间片,以实现进程间的公平竞争和高效利用CPU资源。所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。新进程为子进程,而原就进程为父进程。(一般而言,父进程会关心子进程的完成情况,所以需要子进程退出码来判断子进程完成情况)通常、父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。:进程运行完成时是否是正常的结果,如果不是,可以用不同的数字,表示不同的出错原因。
2025-04-20 19:11:17
851
原创 Linux操作系统--环境变量
这篇文章主要介绍了环境变量的基本概念和常见用途,以及常见的环境变量如PATH、HOME、SHELL等。文章中展示了如何测试环境变量的设置和使用,以及通过命令如echo、export、env、unset、set来操作环境变量。此外,还介绍了通过代码获取环境变量的方法,包括使用main函数的参数env变量、extern变量environ和系统调用getenv、putenv来获取和设置环境变量的示例。最后,文章提及了修改已存在的环境变量、删除环境变量以及环境变量的全局属性。
2025-04-19 22:27:14
1313
原创 Linux操作系统--静态库和动态库的生成and四种解决加载找不到动态库的四种方法
这篇文章主要介绍了静态库和动态库的概念以及它们的区别,包括静态库(.a)在编译链接时将库代码链接到可执行文件中,而动态库(.so)在运行时才链接库的代码,实现多个程序共享使用库的代码。文章还详细介绍了生成静态库和动态库的方法,以及解决加载找不到动态库的四种方法。需要注意的是,静态库在程序编译链接时就被链接,而动态库则在程序运行时动态链接。
2025-04-17 21:55:35
927
原创 dfs二叉树中的深搜(回溯、剪枝)--力扣129、814、230、257
给定一个二叉树,树中每个节点存放一个0到9之间的数字,求从根节点到叶节点生成的所有数字之和。解法使用深度优先搜索(DFS)的前序遍历,整合父节点信息与当前节点信息计算当前节点数字,并递归向下传递,在叶子节点处返回结果。:给定一个二叉树,节点值为0或1,返回移除所有不包含1的子树的原二叉树。解法使用DFS的后序遍历,逐步删除叶子节点,保证删除后节点仍满足条件。:判断给定二叉树是否是有效的二叉搜索树。解法利用中序遍历,递归判断左子树是否为BST,当前节点是否满足BST条件,以及右子树是否为BST。
2025-04-16 23:49:39
939
原创 五道递归算法题--让你彻底爱上递归
摘要:1. 在面试题08.06.汉诺塔问题中,通过递归将所有盘子从柱子A移动到柱子C。2. 在21.合并两个有序链表中,通过递归合并两个升序链表为一个新的升序链表。3. 在206.反转链表中,通过递归实现链表的反转操作。4. 在24.两两交换链表中的结点中,通过递归交换链表中相邻的节点。5. 在50.Pow(x,n)中,通过递归实现计算x的n次幂函数。
2025-04-14 22:48:39
509
原创 Linux操作系统--进程优先级
所以我们可以通过调节nice值,当nice值为负数的时候,那么该程序的PRI变小,即其优先级会变高,则越快被执行。原因:因为资源是有限的,进程是多个的,注定了进程之间的竞争关系。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。进程在从CPU上离开的时候,要将自己的上下文数据保存好,甚至带走。CPU内的寄存器里面保存的是进程相关的数据。
2025-04-12 20:24:40
1113
原创 Linux操作系统--进程状态
本文介绍了进程在操作系统中的不同状态,包括运行、阻塞、挂起等。进程状态可以通过观察任务状态数组中的标识来判断,其中包括运行状态(R)、睡眠状态(S)、磁盘休眠状态(D)、停止状态(T)、死亡状态(X)和僵尸状态(Z)等。作者还给出了查看进程状态和处理僵尸进程的代码示例,说明了僵尸进程的产生原因和影响,以及解决方法。此外,还介绍了孤儿进程的概念和示例代码,说明了孤儿进程可能导致的问题。文章内容详细介绍了进程状态管理和相关问题,对操作系统进程管理有一定的启发意义。
2025-04-11 15:25:41
953
原创 字符串计算算法题(对进位更加得心应手)--力扣67二进制求和,43字符串相乘
文章包含两道题目的解法:1. 第一道题目是“67.二进制求和”,要求给定两个二进制字符串,返回它们的和。解法使用了模拟十进制的大数相加的过程,通过遍历两个字符串同时进行相加并处理进位的操作,最终得到结果。2. 第二道题目是“43.字符串相乘”,要求给定两个以字符串形式表示的非负整数,返回它们的乘积。解法采用了无进位相乘然后相加的思路,首先进行数字相乘得到中间结果,然后处理进位并最终得到乘积的字符串形式。文章提供了题目链接、描述以及具体的代码解法,并且通过示例说明了解题思路。
2025-04-09 20:05:54
951
原创 Linux操作系统--进程的概念
这篇文章主要介绍了进程相关的概念和操作,包括了解进程前的背景知识和进程的具体内容。在了解进程前的背景知识部分,提到了冯诺依曼体系结构和操作系统的重要性。在进程的具体内容中,包括了进程的概念,描述进程相关的PCB内部结构,查看进程的方法,通过系统调用获取进程标识符,认识fork()函数创建新进程的过程。文章以代码示例的形式展示了如何获取进程的标识符,查看进程信息以及使用fork()函数创建新进程。整体而言,这篇文章是一个对进程概念和操作的简要介绍和实践指引。
2025-04-06 19:38:26
1148
原创 归并排序算啊模板and三道困难级别的归并力扣算法题--LCR170,493,315
这篇博文介绍了归并排序算法在解决交易逆序对、计算右侧小于当前元素数量、翻转对等问题中的应用。通过归并排序的分治思想,能够有效统计逆序对的数量和右侧小于当前元素的个数。同时,降序版本的归并排序也能应用在翻转对问题中。算法实现清晰,逻辑严谨,有效解决了这些问题。
2025-04-04 16:01:08
968
原创 快排算法模板and两道值得细品的快排算法题--力扣215、LCR159
本文介绍了快速排序算法的模板及其应用。首先给出了快速排序的模板代码,包括随机选择基准元素和将数组分三块的步骤。然后分别展示了两道题目的解法:1. 第一个题目是 LeetCode 215. 数组中的第K个最大元素,要求返回数组中第K个最大的元素。采用了时间复杂度为O(n)的快速排序算法解决此问题。2. 第二个题目是 LCR.159 库存管理,要求返回库存余量最少的cnt个商品余量,顺序不限。同样使用快速排序算法解决。每个解法都包含了基准元素的随机选择、数组分三块和递归处理的步骤。代码中使用了sra
2025-04-03 20:31:29
791
原创 前缀和算法题--力扣.560和974
找到在[0,i-1]区间内,有多少前缀和等于sum[i] - k即可。想知道有多少个以i为结尾的和为k的子数组,就要找到有多少个起始位置为x1,x2,x3···使得[x,i]区间内的所有的和为k。如果(a-b)% n == 0,那么我们可以得到一个结论:a%n == b%n。例如:(26-2)% 12 ==0,那么26%12 == 2%12 == 2。设i为数组中的任意位置,用sum[i]表示[0,1]区间内所有元素的和。设i为数组中的任意位置,用sum[i]表示[0,i]区间内所有元素的和。
2025-03-30 14:26:23
930
原创 二分查找模板--从题目中讲解三大二分模板
当mid指向左边的元素时,想要left = right,就必须right = mid,且right向左,所以是寻找左边界且right = mid,left = mid+1。当mid指向右边的元素时,想要left = right,就必须left = mid,且left向左,所以是寻找右边界且left = mid,right = mid-1。因为只有当left = right的时候才是找到边界。用的还是二分思想,就是根据数据的性质,在某种判断条件下将区间一分为二,然后舍去其中一个区间,然后再另一个区间内查找;
2025-03-27 23:21:48
1089
原创 (滑动窗口)算法训练篇11--力扣3.无重复字符的最长字串(难度中等)
研究对象依旧是一段连续的区间,因此继续使用滑动窗口思想来优化。让滑动窗口满足:窗口内所有元素都是不重复的。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。
2025-03-22 22:05:28
464
原创 (滑动窗口)算法训练篇10--力扣9.长度最小的子数组(难度中等)
让滑动窗口满足:从i位置开始,窗口内所有元素的和小于target(那么当窗口内元素之和第一次大于等于目标值的时候,就是i位置开始,满足条件的最小长度)。虽然代码是两层循环,但我们的left指针和right指针都是不回退的,两个最多往后移动n次。因此时间复杂度是o(N)由于此问题分析的对象是一段连续的区间,因此可以考虑滑动窗口的思想来解决这道题。单调性(左右两个指针都是一直增或者一直减,并且不会超过对方)+同向指针。如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。个正整数的数组和一个正整数。
2025-03-22 17:04:45
603
原创 优选算法训练篇08--力扣15.三数之和(难度中等)
稍微不同的是,题目种要求找到所有不重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。但是要注意的是,这道题里面需要有。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。
2025-03-21 21:37:41
515
原创 优选算法训练篇07--力扣LCR179.查找总价格为目标值的两个商品
注意到本题是升序的数组,因此我们可以用对象指针优化时间复杂度。两层for循环列出所有两个数的组合,判断是否等于目标值。请在购物车中找到两个商品的价格总和刚好是。购物车内的商品价格按照升序记录于数组。若存在多种情况,返回任一结果即可。[27,34] 或者 [34,27][3,15] 或者 [15,3]
2025-03-20 19:31:10
851
原创 算法训练篇06--力扣611.有效三角形的个数
根据解法一中的优化思想,我们可以固定一个最长边,然后在比这条边小的有序数组中找出一个二元组,使这个二元组之和大于这个最长边。由于数组使有序的,我们可以利用对撞指针来优化。三层for循环枚举出所有的三元组,并且判断是否能构成三角形。,返回其中可以组成三角形三条边的三元组个数。2,3,4 (使用第一个 2)2,3,4 (使用第二个 2)给定一个包含非负整数的数组。
2025-03-20 19:30:58
501
原创 算法训练篇04--力扣11.盛水最多的容器
当我们不断重复上述过程,每次都可以舍去大量不必要的枚举过程,直到left与right相遇。期间产生的所有容积里面的最大值,就是最终的答案。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。由此可见,左边界和其余边界的组合情况都可以不用考虑。所以我们可以left++替换这个边界,继续判断下一个左右边界。解法一(暴力求解):计算出所有容器的体积,然后找出其中容积最大的值。轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
2025-03-19 22:06:11
347
原创 算法训练篇03--力扣202.快乐数
由于上述两种情况只会出现一种,因此,只要我们能确定循环是在情况一中进行,还是情况二中进行就能得到结果。为了方便叙述,对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。这一个操作数我们记为x。根据上述的题目分析,我们可以知道对n进行操作,迟早会陷入一个循环圈内。编写一个算法来判断一个数。
2025-03-19 06:00:00
391
原创 算法训练篇02--力扣1089.复写零
调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4],请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。调用函数后,输入的数组将被修改为:[1,2,3]进行原地复写操作的话,会导致没有复写的数。进行上述修改,不要从函数返回任何东西。给你一个长度固定的整数数组。
2025-03-18 14:16:01
704
2
原创 算法训练篇01 -- 力扣283.移动零
这个方法是快排算法中,数据划分过程的重要一步。如果将快排算法拆解的话,这一段小代码就是实现快排算法的核心步骤。
2025-03-17 13:51:32
499
原创 C++29--C++的类型转换
每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。RTTI:Runtime Type Information的简称,即:运行时类型识别。因此C++提出了自己的类型转化风格,注意。C++通过以下方式来支持RTTI。
2025-03-15 16:41:19
709
原创 C++28--特殊类设计
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙武就总结出了《孙子兵法》。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
2025-03-13 18:06:25
1017
原创 C++27--智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。//1.内存申请了忘记释放//2.异常安全问题Func();//这里Func函数抛异常导致delete[] p3未执行,p3没被释放delete[]p3;
2025-03-10 07:32:15
898
原创 C++26--包装器(function bind)
arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。C++中的function本质是一个类模板,也是一个包装器。其中,newCallable本身是一个可调用对象,arg_list是一个逗号分割的参数列表,对应给定的callable的参数。
2025-03-09 12:16:09
541
原创 C++25--lambda表达式
比如:[=.&a,&b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量[&, a, this]: 值传递方式捕捉变量a和this,引用方式捕捉其他变量。通过上述例子可以看出,lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。函数对象,又称为仿函数,即可以像函数一样使用的对象,就是在类中重载了operator()运算符的类对象。上述代码就是使用C++11中的lambda表达式解决,可以看出lambda表达式实际是一个匿名函数。
2025-03-08 21:45:41
1129
原创 C++24--右值引用C++11新特性
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2025-03-05 19:23:51
1040
原创 C++23--位图和布隆过滤器
我们在使用新闻客户端看新闻时,它会给我们不停的推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加1,删除元素时,给k个计数器减1,通过多占用几倍存储空间的代价来增加删除操作。比如:在布隆过滤器中查找”alibaba“时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其它元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。通常是用来判断某个数据存不存在的。
2025-03-02 20:37:52
1160
原创 C++22——哈希
unordered_map在线文档说明unordered_map是存储<key,value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值对常用于唯一的标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同在内部,unordered_map没有对<key,value>按照任何特定的顺序排列,为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2025-03-01 22:44:51
1209
原创 C++21--红黑树
目录1.红黑树的概念2.红黑树的性质3.红黑树结点的定义4.红黑树的结构5.红黑树的插入操作6.红黑树的验证7.红黑树与AVL树的比较4.红黑树的结构1.按照二叉搜索的树规则插入新结点2.检查新结点插入后,红黑树的性质是否造到破坏约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点情况一:cur为红,p为红,g为黑,u存在且为红注意:此处看到的树,可能是一颗完整的树,也可能是一颗子树如果g是根节点,调整完成后,需要将g改为黑色如果g是子树,g一定有双气囊,且g的双亲如果是红色,
2025-02-24 19:55:50
919
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人