- 博客(53)
- 收藏
- 关注
原创 深入理解 Ext 系列文件系统:从磁盘物理到文件系统原理
本文将深入解析Linux文件系统的核心机制,重点探讨Ext系列文件系统的设计原理。文章从磁盘物理结构入手,详细介绍了磁盘的CHS寻址方式(磁头、柱面、扇区)及其与LBA逻辑块地址的转换关系。通过分析磁盘的逻辑抽象过程,揭示了文件系统如何将三维物理结构转化为一维线性空间进行管理。 在文件系统层面,文章重点讲解了"块"的概念(由8个512字节扇区组成4KB块)、分区原理(以柱面为最小单位)以及inode索引节点的核心作用。inode作为存储文件元信息的128字节数据结构,包含文件权限、大小、
2025-08-05 18:13:56
899
原创 深入理解基础 IO:从 C 库函数到系统调用的全景指南
文章摘要:本文深入探讨文件操作的核心概念与技术实现,从C语言库函数到Linux系统调用。首先解析文件的广义与狭义定义,指出Linux中"一切皆文件"的设计哲学。随后详细讲解C语言文件IO操作,包括fopen、fread/fwrite等函数的使用技巧,以及标准输入输出流的工作原理。最后深入系统调用层面,演示如何通过open、write、read等底层接口直接操作文件,并对比库函数与系统调用的差异。全文通过多个代码示例,帮助读者全面理解文件操作的实现原理和应用场景,掌握从用户态到内核态的文件
2025-08-04 21:44:11
803
4
原创 手把手教你写 Shell 命令行解释器,看透 Shell 工作原理
简易Shell实现原理 本文介绍了一个简易Shell的实现方法,主要包含以下核心功能: 命令行处理: 通过fgets获取用户输入 使用strtok分割命令参数 实现类似[root@localhost]#的提示符 命令执行机制: 区分内建命令(如cd)和外部命令 内建命令直接执行 外部命令通过fork+execvp创建子进程执行 关键实现: 环境变量管理 工作目录跟踪 命令返回码处理 该实现展示了Shell的基本工作原理,包括进程创建、命令解析和环境管理等核心概念。 代码约150行,适合学习Linux系统编程
2025-08-03 23:41:05
1024
1
原创 进程控制:从创建到终结的完整指南
} } 3.2.2 waitpid:更精准的等待 waitpid提供了更灵活的控制: pid_t waitpid(pid_t pid, int *status, int options); // 参数: // pid: 指定子进程PID(>0),或等待任意子进程(-1) // status: 同wait // options: 选项(如WNOHANG表示非阻塞) // 返回值: // 成功返回子进程PID(WNOHANG时可能返回0),失败返回-1 关键特性: 阻塞与非阻塞:通过WNOHANG选项实现非阻塞
2025-07-31 21:54:41
852
7
原创 进程调度:CPU 的 “智能排号系统”(零基础版)
本文用餐厅排号系统类比Linux进程调度机制。CPU像厨师处理排队进程(顾客),O(1)调度算法则如智能排号系统。关键点包括:1)普通优先级(100-139)与nice值(-20~19)通过"120+nice"公式对应,实现进程优先级调控;2)运行队列分活动/过期队列,均按140级优先级分组;3)bitmap位图快速定位最高优先级进程,确保调度效率恒定(O(1))。该设计兼顾公平性与高效性,通过nice值灵活控制进程资源占用程度。
2025-07-26 23:02:35
937
3
原创 零基础看懂 Linux 进程:从概念到实战
《进程入门指南:从零理解计算机核心概念》摘要 本文以通俗语言讲解进程的核心知识: 本质:进程即运行中的程序(如浏览器、微信),通过ps aux或/proc目录可查看 关键特性: 唯一PID标识和父进程PPID 通过fork()创建子进程,父子进程独立运行 五大状态: R(运行/就绪)、S(可中断睡眠)、D(不可中断睡眠)、T(暂停)、Z(僵尸进程需及时处理) 优先级:PRI值决定CPU使用权,可通过NI值调整(范围-20~19) 并发原理:CPU通过快速切换进程上下文实现"同时运行"效果
2025-07-26 20:43:26
580
1
原创 从调试小白到高手:GDB调试工具完全指南
GDB调试工具从入门到精通:掌握Linux程序调试的核心技能 本文系统介绍了GDB调试工具的使用方法。首先强调调试前必须使用-g选项编译生成Debug版本程序。基础部分详细讲解了GDB的核心操作:启动调试、查看代码(list)、设置断点(break)、单步执行(next/step)、查看变量(print)等。进阶部分介绍了cgdb分屏工具、变量监视(watch)、函数堆栈查看(backtrace)等高效调试技巧。通过示例代码演示了如何定位循环逻辑错误、追踪变量变化等常见调试场景,帮助开发者快速掌握Linux
2025-07-18 21:27:25
949
4
原创 从“善变的甲方”到协作自如:Git版本控制入门指南
Git是一款强大的分布式版本控制工具,能有效解决代码管理中的三大痛点:数据安全、协作开发和版本回退。文章介绍了Git与代码托管平台(Gitee/GitHub)的关系,详细解析了Git的核心概念(仓库、工作区、暂存区、本地/远程仓库)以及基本操作流程(初始化、add、commit、push、pull)。针对多人协作场景,重点讲解了冲突解决方法和.gitignore文件的妙用。通过Git,开发者能够轻松管理项目版本,实现高效团队协作,是程序员必备的开发工具。掌握Git的基本命令,就能显著提升开发效率和代码安全性
2025-07-18 16:58:41
915
1
原创 C语言:基础篇之常见概念
C语言是一种广泛使用的计算机编程语言,最初为Unix系统开发而设计。它属于编译型语言,需要通过编译器将源代码转换为可执行的二进制文件。C语言程序从main函数开始执行,main函数是程序的唯一入口。常见的C语言编译器包括msvc、clang和gcc,集成开发环境(IDE)如VS2022、XCode等提供了代码编辑、编译、调试等功能。C语言中的库函数如printf用于在屏幕上打印信息,使用前需包含相应的头文件。C语言还定义了32个关键字,如int、if等,这些关键字具有特殊意义,不能用于其他用途。
2025-05-20 19:28:11
1203
3
原创 Linux深度探索:进程管理与系统架构
要是删掉这个路径,并不影响进程,因为你删掉的是磁盘上的文件,而进程启动时,这个程序的拷贝已经在内存了,所以删掉并不直接影响这个进程,当然后面可能会有影响,后面再说。举个场景,你在北京,你的朋友在南京,今天你两在QQ进行聊天,当你们两个聊天的时候,请帮我解释一下,今天你通过键盘输入了一个“你好”,那么“你好”这个字符串信息是如何展现在你朋友的显示器上的?pid_t是系统提供的,不是C语言的double这些,但Linux也是由C语言写的,这pid_t虽然是个系统级的类型,但它其实就是个int。
2025-04-21 18:59:03
2515
21
原创 Linux第一个系统程序——进度条
我们要知道,C语言执行代码时,一直是从上向下执行的,所有一定是先执行printf,再执行sleep。如果我们的光标在第一个位置,写入9,这时光标会向后移动,但我们想办法让光标再移动到开头,再向里面写8,…,按照这样的原理,我们就可以很容易的实现一个倒计时程序。printf打印,是把信息写在stdout(标准输出)里面,所以打印时信息没有刷出来,就用fflush刷新一下标准输出,就可以把这个字符串立即刷新出来。原来是因为把\n变成\r后,没有\n了,所以数字会被写在缓存区里,一直不被更新。
2025-04-19 20:56:48
1269
11
原创 掌握Linux项目自动化构建:从零入门make与Makefile
不会写Makefile的程序员,就像不会用筷子的美食家——永远尝不到工程化开发的精髓。在Windows环境下我们习惯使用Visual Studio等IDE的一键编译,但在Linux开发环境中,掌握Makefile就像获得了一把打开高效开发之门的钥匙。实现真正的自动化编译- 一个命令完成整个项目的构建提升编译效率- 只重新编译修改过的文件管理复杂项目- 轻松处理多文件、多目录的依赖关系跨平台移植- 一套构建规则适应不同开发环境在Linux开发中,make是一个智能编译命令,而Makefile是它的。
2025-03-26 22:10:28
1703
8
原创 Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接
掌握gcc/g++的编译原理和使用技巧,是成为Linux开发高手的必经之路。希望本文能帮助您系统理解编译过程,在实际开发中游刃有余!💡 思考题:为什么说"编译器也是软件"?因为编译器本身就是用其他语言编写的程序,可以通过迭代不断升级。📌 注意:虽然g++可以编译C代码,但建议严格区分使用,避免潜在的兼容性问题。
2025-03-26 11:03:12
1049
17
原创 Linux软件包管理与Vim编辑器指南
在Linux下安装软件,一种常见的方法是下载程序的源代码,并进行编译,得到可执行程序。然而,这种方法既耗时又繁琐。为了方便,人们将一些常用的软件提前编译好,做成软件包,存放在服务器上。通过包管理器,用户可以方便地获取这些编译好的软件包,直接进行安装。软件包管理:Linux下使用yum可以方便地管理软件包,包括安装、卸载和更新。Vim编辑器:Vim是一个强大的文本编辑器,掌握其基本操作和配置可以大大提高编辑效率。
2025-03-12 15:49:08
1212
17
原创 Linux必备技能:打包压缩与权限管理详解
掌握打包压缩和权限管理是Linux使用的核心技能。通过合理压缩文件提升效率,深入理解权限机制保障系统安全。实践过程中,善用热键和工具(如。打包压缩是通过特定算法将多个文件合并或压缩,减少体积的技术。打包后的文件不仅体积更小,还能作为一个整体传输,提升效率。),并灵活调整权限设置,能让你的Linux之旅更加顺畅!:创建一个共享目录,设置粘滞位,体验权限控制的魅力吧!
2025-03-08 16:10:05
1143
13
原创 Linux入门必备:基础指令详解
掌握这些基础指令后,你已能高效操作Linux系统。建议多实践以巩固记忆,后续可深入学习Shell脚本编写和权限管理等进阶内容。掌握Linux命令行操作是开发者、运维人员的基本技能。本文整理常用Linux指令及使用场景,助你快速上手。删除空目录(仅当目录无内容时生效)误删可能导致数据丢失。显示当前所在目录的绝对路径。创建空文件或更新文件时间戳。移动文件/目录 或 重命名。以树状结构显示目录内容。按名称/类型查找文件。
2025-03-03 00:37:55
1288
16
原创 Linux的诞生:一场自由与协作的技术革命
在今天的互联网世界,Linux几乎无处不在——从智能手机(Android内核)到超级计算机,从云计算平台到家用路由器,它的身影渗透在技术的各个角落。但这样一个改变世界的操作系统,并非诞生于某家商业巨头的实验室,而是一个芬兰大学生“为了好玩”发起的个人项目。1970年代,贝尔实验室开发的Unix系统凭借其简洁的设计和强大的多用户能力,成为学术界和企业的宠儿。(GNU’s Not Unix),旨在创建一个完全自由的操作系统,但直到1990年,GNU仍缺少一个关键组件——内核(即操作系统的核心)。
2025-02-28 00:40:56
1151
11
原创 模拟算法习题篇
在算法中,是一种通过计算机程序来模拟现实世界中的过程或系统行为的方法。它的以下是一个简单的模拟算法题目及其解题思路: 题目:一只长度不计的蠕虫位于n英寸深的井的底部。它每次向上爬u英寸,但休息时会滑落d英寸。求蠕虫爬出井口需要的最少爬行次数。通过上述步骤和示例,可以看到模拟算法的核心在于“”,按照题目要求逐步实现。
2025-01-22 23:08:12
1194
13
原创 前缀和算法习题篇(下)
设[0,x-1]区间内所有元素之和等于a,[0,i]区间内所有元素的和等于b,可得(b-a)%k==0。想知道最大的以i为结尾的和为0的子数组,就要找到从左往右第一个x1使得[x1,i]区间内的所有元素的和为0。于是问题就变成:找到在[0,i-1]区间内,有多少前缀和的余数等于sum[i]%k的即可。设i为数组中的任意位置,用sum[i]表示[0,i]区间内所有元素的和。
2025-01-19 18:11:09
1022
11
原创 【C++进阶篇】——string类的使用
是 C++ 标准库的一部分,但它不是 STL 容器的一部分。STL 容器是指那些基于模板的容器,如std::list等。提供了类似于 STL 容器的功能,比如动态内存管理、迭代器支持等,但它的设计和实现是独立的。被归为 STL 是因为它具有类似于 STL 容器的特性和功能,尽管它在技术上并不属于 STL。这种归类更多是出于功能和使用上的相似性,而不是严格的分类。是 C++ 标准库中的一个类,它提供了一种方便的方式来创建、操作和处理字符串。
2024-11-17 02:10:07
1724
32
原创 前缀和算法习题篇(上)
举例:当访问的区间是[0,2]时,区间内所有元素的和为dp[2]-dp[-1],这里的dp[-1]越界。而当访问的区间是[1,2]时,区间内所有元素的和为dp[2]-dp[0],使dp[0]=0即可,不会越界。最后,本篇文章到此结束,感觉不错的友友们可以一键三连支持一下笔者,有任何问题欢迎在评论区留言哦~快速是指O(1),前缀和思想可把时间复杂度可降到O(q)。时间复杂度是O(n* m *q),会超时。时间复杂度为O(m*n)+O(q).时间复杂度是O(n*q),会超时。时间复杂度为O(q)+O(n).
2024-11-13 23:26:04
1256
17
原创 AI大模型:重塑软件开发流程的优势、挑战及应对策略
随着人工智能技术的飞速发展,AI大模型正在深刻影响着软件开发的各个环节。本文将详细分析AI在软件开发流程中带来的优势,面临的挑战,以及开发者的应对策略。
2024-11-12 12:50:06
609
5
原创 多模态AI:开启人工智能的新纪元
多模态AI是指人工智能系统能够理解和处理多种不同类型数据输入的能力。这些数据类型包括文本、图像、声音、视频等。简单来说,多模态AI能够接收多种数据类型,并输出多种类型的信息。与单模态AI相比,后者只能处理单一类型的数据输入和输出。多模态AI技术的发展不仅拓展了AI的应用范围,更重要的是,它模糊了人类感知与AI理解之间的界限。这种趋势可能导致人机交互方式的根本性转变,使AI成为人类认知的无缝延伸,而非单纯的工具。随着多模态AI技术的不断进步,我们有理由相信,它将为人类社会带来更多的便利和创新。
2024-11-11 23:38:51
1035
6
原创 “容器的舞步:如何用范围for循环优雅地遍历”
范围for循环是一种特殊的for循环,它允许我们直接遍历一个集合中的所有元素,而不需要手动管理循环的索引或迭代器。这种循环的语法非常简单,由两部分组成,中间用冒号“:”分隔。第一部分是用于迭代的变量,第二部分是被迭代的范围。
2024-11-11 11:33:51
824
6
原创 智能的编织:C++中auto的编织艺术
auto关键字在C++11中提供了一种方便的方式来声明变量,让编译器自动推断变量的类型。这不仅简化了代码,也减少了因类型错误而导致的编译错误。但是,使用auto时也需要小心,特别是在声明指针、引用和数组时,以及在函数参数和返回值中使用时,要确保类型的正确性和代码的清晰性。最后,本篇文章到此结束,感觉不错的友友们可以一键三连支持一下笔者,有任何问题欢迎在评论区留言哦~
2024-11-10 22:01:49
612
16
原创 滑动窗口习题篇(下)
当动态哈希表中包含目标串中所有的字符,并且对应的个数都不小于目标串的哈希表中各个字符的个数,那么当前的窗口就是一种可行的方案。我们可以使用两个哈希表,其中一个将目标串的信息统计起来,另一个哈希表动态的维护窗口内字符串的信息。根据题目描述,我们可以把问题转化:找出一个最长的子数组的长度,子数组中不超过两种类型的水果。不同在于之前处理的对象是一个一个的字符,我们这里处理的对象是一个一个的单词。 输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]的子串,返回这些子串的起始索引。
2024-11-10 16:32:29
704
1
原创 “穿梭于容器之间:C++ STL迭代器的艺术之旅”
迭代器是C++ STL中非常重要的概念,它提供了一种统一的方式来访问和操作容器中的元素。通过合理使用迭代器,开发者可以编写出更加通用、高效、安全的代码。希望这篇博文能帮助你更好地理解和使用迭代器。如果你有任何问题或想法,欢迎在评论区与我交流!
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0〜n-1之内。在范围0〜n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。在这里,二分查找算法在这告一段落,后续会给友友们带来更多的算法解题,感觉不错的友友们可以一键三连支持一下笔者,有任何问题欢迎在评论区留言哦~根据峰顶值的特点(比两侧元素都要大),遍历数组内的每一个元素,找到一个比左右两边元素都大的元素即可。 输入: [0,1,2,3,4,5,6,7,9]在这幅图中,C点即数组中我们所求的最小元素。
2024-11-08 23:55:38
993
18
原创 二分查找习题篇(上)
给定⼀个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。这里,我们把数组的元素分为两部分——小于等于target的部分[left,Bright] and 大于target的部分[Bright+1,right]。这里,我们把数组的元素分为两部分——平方后小于等于x的部分[1,mid] and 平方后大于x的部分[mid-1, x]和一个目标值,在数组中找到目标值,并返回其索引;
2024-11-07 23:24:07
1140
19
原创 滑动窗口习题篇(上)
什么是滑动窗口——同向双指针什么时候用滑动窗口——利用单调性滑动窗口的正确性——利用单调性,规避了很多没有必要的枚举行为滑动窗口的时间复杂度——O(N)用滑动窗口如何书写代码,下列例题示范。
2024-11-03 23:40:13
1596
15
原创 双指针习题篇(下)
最后,本篇文章在此结束,我们了解到双指针法的核心在于通过两个指针的相对移动来减少不必要的遍历,从而提高算法的效率。的数组和一个数字 s ,在数组中查找两个数,使得它们的和正好是 s。在 b 的后面区间内,利用“双指针”找到两个数,使这两个数的和等于 target - a - b即可。在 a 的后面区间内,利用「三数之和」找到三个数,使这三个数的和等于 target - a 即可。3.在该数后面的区间内,利用“双指针算法”快速找到两个数,它们的和等于 -a即可。
2024-11-01 23:56:43
1276
14
原创 双指针习题篇(上)
给定⼀个数组nums,编写⼀个函数。请注意 ,必须在。⽰例 1: 输⼊:nums 输出: [1,3,12,0,0]⽰例 2:nums= [0] 输出: [0]
2024-10-31 23:55:56
772
12
原创 【C++进阶篇】——STL的简介
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。最后,本篇文章到此结束,感觉不错的友友们可以一键三连支持一下笔者,有任何问题欢迎在评论区留言哦~
2024-10-26 20:55:18
757
13
原创 【C++干货篇】——模版初阶
class 类模板名// 类内成员定义// 类模版public:_size = 0;//模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误//声明和定义分离的写法// 扩容++_size;int main()//显示实例化// int// doublereturn 0;
2024-10-26 20:17:10
1168
6
原创 【C++干货篇】——C/C++内存管理
malloc:分配未初始化内存。calloc:分配并初始化为零的内存。realloc:改变已有内存块的大小,并可能移动内存块。使用这些函数时,记得调用free来释放不再需要的内存,以防止内存泄漏。int main()//只申请空间//申请空间+调用构造函数//没有默认构造可以自己传参//可以调用默认构造free(p1);//只释放空间//调用析构函数+释放空间delete p2;
2024-10-24 21:55:44
2635
15
原创 【C++干货篇】——类和对象的魅力(四)
将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针(this指向的对象),表明在该成员函数中不能对类的任何成员进行修改。const 修饰Date类的Print成员函数,Print隐含的this指针由 Date* const this 变为 const Date* const this
2024-10-22 23:48:13
2766
8
原创 【C++干货篇】——类和对象的魅力(三)
当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。 C++规定类类型对象使用运算符时,必须转换成调用对应运算符重载, 若没有对应的运算符重载,则会编译报错。运算符重载是具有特殊名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。
2024-10-21 23:35:33
1311
6
原创 【C++干货篇】——类和对象的魅力(二)
如果类中没有申请资源时,析构函数可以不写,直接使⽤编译器⽣成的默认析构函数,如Date;如果默认⽣成的析构就可以⽤,也就不需要显⽰写析构,如MyQueue;但是有资源申请时,⼀定要⾃⼰写析构,否则会造成资源泄漏,如Stack。
2024-10-20 23:51:56
1551
11
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人