自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux信号详解

本文以快递场景类比,生动讲解了操作系统信号机制的核心概念:信号产生(如键盘输入、硬件异常、软件条件)、识别与处理(默认/自定义/忽略动作)、保存(通过位图记录Pending状态)、阻塞与递达的差异。信号处理涉及用户态与内核态切换,硬件中断(如时钟、外设)和软件中断(如系统调用)是其底层基础。文章还介绍了信号集操作函数(sigprocmask、sigpending)、信号捕捉流程、volatile关键字防优化,以及sigaction函数的扩展功能。最后通过SIGCHLD信号示例,说明如何避免僵尸进程。

2025-06-11 12:23:18 781

原创 Linux进程间通信

本文介绍了进程间通信(IPC)的主要方法和实现原理。主要内容包括:1. IPC的分类和发展历程,包括管道、SystemV IPC和POSIX IPC;2. 匿名管道和命名管道的创建、使用及区别,重点分析了管道的读写规则和特性;3. SystemV共享内存的原理与实现,详细说明了shmget、shmat等关键函数的使用方法;4. SystemV信号量的作用机制,阐述了其对临界资源的保护原理。文章从内核角度深入解析了各种IPC方式的本质,特别强调了共享内存的高效性和信号量的同步保护功能,

2025-05-29 19:36:14 695

原创 Linux—进程池实现

进程池实现方案通过预创建和管理子进程提高并发效率。核心组件包括:1)Channel类封装进程通信管道,包含文件描述符、进程ID等属性,提供发送消息和关闭功能;2)ChannelManager采用轮询机制管理多个Channel,确保负载均衡;3)ProcessPool主类负责创建子进程池,通过管道进行任务分发。实现时需注意父子进程的管道文件描述符继承问题,解决方案包括反向关闭管道或统一关闭所有写端。该系统支持注册多种任务类型(如日志打印、文件上传下载),通过随机选择任务码实现任务分配,避免频繁创建销毁进程的开

2025-05-24 14:14:06 586

原创 Linux动静态库制作与原理

库是预先编写好的、成熟的、可复用的代码集合,分为静态库和动态库。静态库在编译时链接到可执行文件中,程序运行时不再需要静态库;动态库则在程序运行时才链接,多个程序可以共享使用。静态库通过将目标文件(.o)打包生成,动态库则需要编译为位置无关代码(PIC)并通过共享选项生成。动态库的核心特性是可以被加载到内存的任意地址,并被多个程序共享,节省内存和磁盘空间。动态链接通过全局偏移表(GOT)和过程连接表(PLT)实现,延迟绑定进一步优化了性能。库的存在使得程序开发更加高效,避免了从零开始编写代码的繁琐。

2025-05-19 20:25:58 844

原创 Linux的Ext系列文件系统

文章详细介绍了磁盘的物理和逻辑结构,包括扇区、磁头、磁道、柱面等基本概念,并解释了CHS和LBA两种寻址方式。磁盘的存储单位是扇区,通常大小为512字节,而操作系统读取数据时以“块”为单位,通常为4KB。文章还讨论了磁盘的分区、文件系统的组织方式,特别是ext2文件系统的结构,包括超级块、块位图、inode位图、inode节点表和数据区。此外,文章还介绍了inode的概念,它是存储文件属性的区域,每个文件都有对应的inode。最后,文章探讨了软硬链接的区别及其用途

2025-05-13 11:11:15 973

原创 Linux基础io知识

文件在计算机系统中扮演着重要角色,狭义上指存储在磁盘上的数据,磁盘作为永久性存储介质,文件在其上的存储是永久性的。广义上,Linux系统中“一切皆文件”,包括键盘、显示器等设备。文件操作本质是对外设的输入输出(IO),涉及文件内容和属性的管理。操作系统通过系统调用接口管理文件,而非直接通过C语言等库函数。文件描述符(fd)是操作系统识别文件的关键,通过它进行文件的读写操作。重定向技术如dup2函数,可以改变标准输入输出的目标,实现数据的灵活处理。理解文件操作和系统调用对于深入掌握计算机系统至关重要。

2025-05-11 15:59:42 629

原创 自定义实现shell命令解释器

由于命令行不会打印出整条路径,只会输出最后一个所在文件,所以可以用string来实现这个功能使用rfind来查找最后一个路径。最后提取子串即可。

2025-05-07 16:47:37 732

原创 Linux进程控制与替换详解

在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为子进程,而原进程为父进程。进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中 fork返回,开始调度器调度

2025-05-03 17:27:20 718

原创 进程地址空间

这种形式的程序地址空间根本不可能在内存中存在,这是因为在cpu中需要同时运行很多个进程。无法将每个进程都按照这个形式排列,这样进程将会没有空间运行。可以通过这段代码来帮助我们了解地址结构,运行结果如图所示我们可以发现全局变量的地址与static变量的地址相邻,说明static变量也是全局变量的一种。

2025-05-01 00:10:30 1052

原创 Linux环境变量

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

2025-04-29 09:38:41 903

原创 Linux进程详细解析

基本概念与基本操作课本概念:程序的⼀个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。描述进程-PCB进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct 。task_struct-PCB的⼀种在Linux中描述进程的结构体叫做task_struct。 

2025-04-27 23:34:26 910

原创 cgdb的基础使用教程

ubuntu的下载方式centos的下载方式。

2025-04-23 22:01:29 425

原创 蓝桥杯十一届C++B组真题题解

【问题描述】小蓝要为一条街的住户制作门牌号。这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、 0、 1、 7,即需要 1 个字符 0, 2 个字符 1, 1 个字符 7。请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。

2025-04-09 08:57:19 715

原创 蓝桥杯十三届C++B组真题题解

九进制正整数 (2022), 转换成十进制等于多少?这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

2025-03-24 21:22:37 608

原创 蓝桥杯十四届C++B组真题题解

【问题描述】小蓝现在有一个长度为100的数组,数组中的每个元素的值都在0到9的范围之内。数组中的元素从左至右如下所示:现在他想要从这个数组中寻找一些满足以下条件的子序列:1.子序列的长度为 8:2.这个子序列可以按照下标顺序组成一个 yyy,ymmdd 格式的日期,并且要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。

2025-03-20 20:22:08 1131

原创 蓝桥杯十五届c++B组真题题解

先将50个人之间握手的次数求出,再减去7个人之间相互握手的次数即可。

2025-03-18 14:14:22 906

原创 Linux项目自动化构建工具-make/Makefile

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

2025-03-16 21:57:50 620

原创 Linux环境安装基础工具使用

gcc code.c -o code -DM:会在源文件命令行中动态添加宏Mgcc code.c -0 code -DM=100 将M的值设置为100这是因为。

2025-03-15 14:04:10 656

原创 C++并查集的功能以及实现详解

在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不 同的学校,起先互不相识,每个学生都是一个独立的小团体,给以下数组用来存储该小集体,数组中的数字代表:该小集体中具有成员的个 数。(负号下文解释)

2025-03-15 12:06:26 245

原创 C++智能指针

这样保障了资源的正常 释放,避免资源泄漏问题。• 智能指针类除了满足RAII的设计思路,还要方便资源的访问,所以智能指针类还会想迭代器类⼀ 样,重载 operator*/operator->/operator[] 等运算符,方便访问资源。• 智能指针实际上是代管资源,是模拟指针的行为,和平常使用的树,链表等等不一样,在这些数据结构中我们拷贝对象是想获取内容,而指针不一样,指针是访问修改资源,而不是拥有资源,所以智能指针拷贝是共同管理资源,是多个指针共同指向同一个对象,是浅拷贝。

2024-12-19 15:58:30 882

原创 C++异常

・异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节无须知道问题的处理模块的所有细节。・C 语言主要通过错误码的形式处理错误,错误码本质就是对错误信息进行分类编号,拿到错误码以后还要去查询错误信息,比较麻烦。

2024-12-17 12:53:00 818

原创 C++11语法解析(二)

C++11 支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数目的参数被称为参数包,存在两种参数包:模板参数包,表示零或多个模板参数;函数参数包:表示零或多个函数参数。例如我们在C语言中使用的printf和scanf,它们都是支持传不同个数和类型的参数・template void Func (Args... args) {}・template void Func (Args&... args) {}

2024-12-15 22:46:37 808

原创 哈希表实现

哈希(hash)又称散列,是一种组织数据的方式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字 Key 跟存储位置建立一个映射关系,查找时通过这个哈希函数计算出 Key 存储的位置,进行快速查找。

2024-12-09 19:56:35 1277

原创 unordered_map与unordered_set封装

SGI-STL30版本源代码中没有 unordered_map 和 unordered_set,SGI-STL30版本是 C++11 之前的 STL 版本,。但是 SGI-STL30 实现了哈希表,只容器的名字是 hash_map 和 hash_set,他是作为非标准的容器出现的,非标准是指非 C++ 标准规定必须实现的,源代码在 hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h 中、

2024-12-08 23:03:25 385

原创 c++11语法解析(一)

C++11是C++的第⼆个主要版本,并且是从C++98起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对C++程序员可用的抽象。在它最终由ISO在2011年8⽉12⽇采纳前,⼈们曾使用名称“C++0x”,因为它曾被期待在2010年之前发布。C++03与C++11期间花了8年时间,故而这是迄今为止最长的版本间隔。从那时起,C++有规律地每3年更新⼀次。

2024-12-08 21:19:33 909

原创 红黑树实现

红黑树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何⼀条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保没有⼀条路径会比其他路径长出2倍,因而是接近平衡的。

2024-11-01 15:17:35 769

原创 AVL树详解

AVL树是最先发明的自平衡二叉查找树,AVL是⼀颗空树,或者具备下列性质的二叉搜索树:它的左右子树都是AV树,且左右子树的高度差的绝对值不超过1。AVL树是⼀颗高度平衡搜索⼆叉树, 通过控制高度差去控制平衡。AVL树得名于它的发明者G.M.Adelson-Velsky和E.M.Landis是两个前苏联的科学家,他们在1962 年的论文《Analgorithm for the organization of information》中发表了它。

2024-10-28 11:18:53 1071

原创 Linux权限说明

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含: 将使用者的命令翻译给核心(kernel)处理。 同时,将核心的处理结果翻译给使用者。

2024-10-19 12:19:23 683

原创 Linux基本指令

Linux在服务器领域的发展 随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,已经形成了大规模市场应用的局面。并且保持着快速的增长率。尤其在政府、金融、农业、交通、电信等国家关键领域。此外,考虑到Linux的快速成长性以及国家相关政策的扶持力度,Linux服务器产品一定能够冲击更大的服务器市场。 据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,

2024-10-16 15:31:15 679

原创 c++ map

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是用红黑树实现,增删查改效率是O(logN) ,迭代器遍历是走的中序,所以是按key有序顺序遍历的。

2024-09-25 10:55:10 1263

原创 c++ set

前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这 些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,比如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。 关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构, 两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。

2024-09-24 23:37:37 838

原创 c++二叉搜索树

⼆叉搜索树又称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:• 若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值• 若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值• 它的左右子树也分别为⼆叉搜索树• 二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义

2024-09-21 18:12:56 1045

原创 c++多态

多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲运行时多态,编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们前面讲的函数重载和函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运行时归为动态。

2024-09-18 15:58:51 1173

原创 C++继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。

2024-09-13 09:06:23 815

原创 c++进阶模板

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有 目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-09-09 22:31:56 878

原创 C++deque

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为 容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认 使用deque,

2024-09-08 11:53:20 1034

原创 C++ priority_queue

优先级队列是一种容器适配器,专门设计使其第一个元素始终是它包含的元素中最大的,根据一些严格的弱排序标准。此上下文类似于堆,其中元素可以随时插入,并且只能检索最大堆元素(优先级队列中位于顶部的元素)。

2024-09-08 11:38:58 349

原创 c++stack和list 介绍

堆栈是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。堆栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器 的类,提供一组特定的成员函数来访问其元素。元素从特定容器的“back”推送或弹出,这称为堆栈的顶部。1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元 素,另一端提取元素。

2024-09-07 20:40:39 912

原创 c++list

列表是序列容器,允许对序列中任意位置的恒定时间插入和擦除操作,以及双向迭代。列表容器被实现为双向链表;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。排序在内部通过与指向其前面的元素的链接和指向其后元素的链接的每个元素的关联来保持。它们与 forward_list 非常相似:主要区别在于 forward_list 对象是单链表,因此它们只能向前迭代,以换取更小、更高效。与其他基本标准序列容器(array、vector 和 deque)相比,列表在容器中已经获得迭代器的任何位置插入、

2024-09-03 20:20:19 496

原创 vector介绍

vector与c语言中的数组类似,是数组的进阶,它能够根据需求改变自身的长度,就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样高效,但与数组不同的是,它们的大小可以动态变化,其存储由容器自动处理。

2024-09-01 15:34:00 1517

空空如也

空空如也

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

TA关注的人

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