- 博客(65)
- 收藏
- 关注
原创 Linux 网络:HTTP(三)Linux 服务器实现
本文介绍在 Linux 下用 C++17 实现简易 HTTP 服务器的完整流程:从套接字监听、接收字节,到解析请求行与报头,按方法和路径路由,最终通过安全路径映射读取静态文件并生成响应。强调模块分离、请求完整性校验、资源路径防护(如使用 openat2 限制访问范围),以及正确处理内容长度、编码与状态码。代码实现遵循 RFC 9112,确保协议合规性,为后续扩展连接复用与动态业务打下基础。
2026-10-26 20:13:23
810
51
原创 Linux 网络:HTTP(二)请求方法、状态码与登录状态
本文系统讲解HTTP请求方法、状态码与登录状态管理。重点解析GET/POST语义差异,强调安全性与幂等性原则;说明表单提交如何转化为请求,数据通过application/x-www-form-urlencoded编码传输;详解2xx成功、4xx错误、3xx重定向状态码的使用场景,特别是POST/Redirect/GET模式避免重复提交;最后阐明Cookie机制在维持登录状态中的作用,揭示HTTP无状态特性下身份管理的核心逻辑。
2026-10-23 18:54:53
298
22
原创 Linux 网络:HTTP(一)基础与报文结构
本文介绍了HTTP协议在应用层的核心作用,阐述其请求与响应的报文结构。通过解析请求行、报头字段与正文,说明了方法、路径、状态码及关键报头(如Host、Content-Type)的功能。强调资源定位与实际文件无必然对应,且不同内容需正确设置媒体类型以确保客户端正确解析。结合实例展示网页访问中的多请求机制,揭示HTTP作为通用通信规则的基础地位。
2026-10-21 15:38:31
1044
49
原创 递归、搜索与回溯:从板书到二叉树解题方法
本文系统梳理递归、搜索与回溯的解题方法,以“找相同子问题→设计函数头→只讨论一层→定出口→核对参数返回”为主线,结合板书与力扣二叉树题单,通过12个完整Solution示例(C++17)验证,涵盖函数契约、调用树绘制、状态恢复、记忆化等核心技巧。强调参数传递方向、返回值设计、回溯恢复规则及边界处理,提供可复用的分析模板与自测方法,助力高效攻克递归类题目。
2026-10-17 20:45:34
151
6
原创 Linux 网络:序列化与反序列化
本文介绍Linux网络编程中序列化与反序列化的必要性,以网络计算器为例,说明如何通过JSON格式约定数据结构,实现跨平台、跨语言的数据交换。重点讲解了使用JsonCpp库进行对象到文本的序列化与反序列化过程,强调字段类型校验、运算符作为单字符字符串处理、严格解析JSON语法及防止内存布局差异带来的问题,确保通信双方正确理解数据含义。
2026-10-17 20:00:04
1473
62
原创 UDP/TCP套接字揭秘:从回显到聊天室
UDP 基于数据报,无连接、不保证顺序与可靠性,通信双方直接通过 sendto/recvfrom 交换带源地址的数据报,服务器用一个套接字服务多客户端,适合广播或实时场景。TCP 面向连接,提供可靠字节流,需经 listen、accept 建立连接,使用独立的连接套接字进行读写,适用于需要有序、可靠传输的场景。两者差异源于通信模型本质:UDP 简洁高效,TCP 严谨可靠。
2026-10-14 22:58:09
124
3
原创 UDP vs TCP:套接字编程的底层真相
本文系统讲解Linux下UDP与TCP套接字编程核心概念。UDP为无连接、不可靠的数据报协议,通信双方通过sendto/recvfrom直接收发数据,服务器仅需一个套接字即可服务多客户端,适合广播或实时场景;而TCP为面向连接的可靠字节流协议,需经listen、accept建立连接,通过独立连接套接字进行读写,保障数据顺序与完整性。文章结合回显服务器、聊天室等实例,阐明两者在通信模型、地址绑定、数据边界及可靠性设计上的本质差异,揭示网络编程中“为何不能只用一个发送函数”的根本原因。
2026-10-14 19:02:19
382
4
原创 Linux硬件中断与进程调度:时钟中断和信号处理结束
本文系统阐述了中断机制在Linux中的核心作用:通过硬件事件触发CPU暂停当前进程,进入内核处理,实现设备响应与进程调度。重点区分了中断与异常,解析了中断号、处理函数及时钟中断对时间片管理的关键影响。结合alarm信号模拟时钟中断,展示了如何用信号驱动简单调度器。最后揭示了从中断到信号的传递路径:硬件事件→中断处理→内核唤醒或发信号→进程返回时处理信号,完整呈现了操作系统响应外部事件并协调多任务执行的底层逻辑。
2026-10-07 15:41:33
254
4
原创 Linux用户态到内核态:系统调用、异常与信号递达
本文系统分析了用户态与内核态的切换机制,阐明系统调用、异常与信号三者的关系。通过 write、fork 等系统调用展示用户进入内核的路径;以除0、非法访问等异常说明处理器如何触发内核介入;最终揭示信号递达的核心流程:内核在返回用户态前检查 pending 与 block 状态,决定是否执行信号处理函数。结合 sigaction 与 signal 的差异,完整呈现了从指令执行到信号处理的底层机制。
2026-10-07 15:40:54
177
1
原创 Linux进程信号:产生、保存、阻塞与处理
Linux信号是异步事件通知机制,用于告知进程发生了特定事件。信号本质为整数编号,具有默认动作、忽略或自定义处理三种响应方式。其生命周期包括产生、保存(pending)、阻塞检查与处理。信号可由键盘输入(如Ctrl+C)、kill命令、alarm定时器或硬件异常触发。通过block表屏蔽信号,pending表暂存未处理信号,handler表定义处理逻辑。使用sigset_t管理信号集合,结合sigprocmask等接口实现精细控制,确保信号在合适时机被处理。
2026-09-28 18:20:12
242
4
原创 Linux进程间通信(IPC):消息队列、信号量与内核对象
本文介绍Linux进程间通信(IPC)机制,重点讲解消息队列与信号量。消息队列作为内核中的先进先出队列,支持按消息类型传输数据,克服了管道字节流传输的局限;信号量则用于同步与资源计数,避免多进程竞争导致的数据不一致问题。两者均基于System V IPC,通过key和id实现对象定位,配合msgget、semget等接口创建与访问。文章还介绍了ftok生成键值、msgsnd/msgrcv收发消息、msgctl删除队列等核心操作,强调了内核对象需显式清理,确保系统资源安全。
2026-09-28 16:04:01
202
1
原创 线程池 ThreadPool
线程池需锁保障线程安全,因多个线程并发访问共享任务队列(如std::queue)会导致数据竞争。通过Mutex实现互斥访问,确保同一时间仅一个线程操作队列。结合LockGuard(RAII)自动管理锁,避免资源泄漏。进一步使用ConditionVariable解决空队列时的阻塞问题:消费者等待任务、生产者等待空间,通过wait()与signal()/broadcast()协调。任务抽象为std::function<void()>,实现任务与线程解耦,提升灵活性。线程池采用生产者-消费者模型,由B
2026-09-21 17:27:12
266
10
原创 Linux 线程 线程的深度理解
本文系统阐述了线程与进程的关系,指出线程是进程内的执行流,作为CPU调度的基本单位,具有更细粒度和更低开销。相比进程,线程共享内存空间,减少资源分配成本,提升并发效率。在Linux中,线程以“轻量级进程”(LWP)形式实现,复用进程管理机制,通过task_struct统一调度。文章还对比了进程与线程在资源隔离、通信方式、健壮性等方面的差异,并强调合理使用线程可显著提升程序性能,但过多线程会带来调度开销与同步风险。
2026-09-20 23:55:18
69
3
原创 简谈线程池
本文实现了一个基于管道通信的简单进程池模型,通过父进程创建多个子进程并管理任务分发。核心设计包括:使用pipe实现父子进程单向通信,子进程阻塞等待任务,父进程轮询派发任务编号。重点解决了文件描述符关闭、资源泄漏、死锁等问题,引入RAII封装文件描述符与unique_ptr管理生命周期,避免对象移动导致的资源冲突。后续优化方向为引入任务队列与双向通信,实现负载均衡与任务完成通知,提升系统可靠性与可扩展性。
2026-09-09 18:27:17
143
23
原创 进程替换 进程替换 进程替换
<think>我们根据要求生成摘要,需≤150字。内容关于进程替换的概念、原理、exec系列接口等。需简洁概括。</think>进程替换是用新进程替换当前进程,通过加载新代码到内存并重映射页表实现。exec系列接口提供不同参数形式(列表/数组、路径搜索、环境变量传递),成功替换后原代码不再执行,仅失败时返回-1。
2026-09-04 19:52:32
305
30
原创 Linux 进程地址空间
本文探讨了C/C++程序内存管理的核心概念,揭示了进程地址空间与物理内存的区别。通过实验验证发现,程序中的内存地址实际上是虚拟地址而非物理地址。文章详细解析了进程地址空间的组成(包括栈区、堆区、静态区等)及其管理机制,重点介绍了操作系统通过页表实现虚拟地址到物理地址的映射关系。特别深入分析了写时拷贝机制的原理:当父子进程共享数据时,初始共享同一物理内存,只有在写入操作时才会创建副本,并通过修改页表权限实现按需拷贝。这种机制既保证了进程独立性,又提高了内存使用效率。文章还解释了malloc/new等内存分配函
2026-08-14 21:30:04
256
25
原创 Linux下的环境变量
本文详细介绍了Linux环境变量的概念、作用与使用方法。主要内容包括:1. 环境变量的基本概念,如PATH、HOME等系统变量及其作用;2. 添加环境变量的方法(export命令)及注意事项;3. 获取环境变量的三种方式:通过main函数参数、getenv函数和命令行工具;4. 环境变量表的特性及其与系统配置文件的关系;5. 命令行参数的意义和使用场景。文章通过具体示例展示了环境变量在程序运行、权限控制等方面的实际应用,并比较了不同用户环境变量的差异。最后解释了环境变量的继承机制及其在系统启动时的加载过程。
2026-08-06 15:49:14
1439
34
原创 进程的 切换 与 调度
本文介绍了Linux系统中的进程调度与切换机制。进程切换通过保存和恢复硬件上下文实现,包括保存当前进程状态、选择新进程、加载新进程上下文三个步骤。Linux采用O(1)调度算法,使用活动队列和过期队列的双队列结构:活动队列存放时间片未耗尽的进程,过期队列存放时间片耗尽的进程,通过交换指针实现快速切换。调度器利用优先级数组和位图快速定位可执行进程,既保证了调度效率(O(1)时间复杂度),又避免了进程饥饿问题。整个机制通过上下文保护/恢复、优先级映射、双队列轮转等设计,实现了高效的进程切换与公平调度。
2026-08-06 15:22:15
249
2
原创 Linux 优先级
本文介绍了操作系统中的进程优先级概念。通过日常生活中的排队场景类比,解释了优先级用于确定进程访问资源的顺序,本质是由于资源有限。文章详细说明了Linux系统中查看和修改进程优先级的方法:使用ps命令查看PRI(优先级)和NI(nice值),其中PRI越小优先级越高,而nice值是用于修正优先级的数值(范围-20到19),通过top命令可以修改。重点强调了操作系统对优先级范围的限制(60-99)是为了避免进程饥饿问题,保证系统调度的公平性。修改优先级实际上是通过调整nice值来实现的,最终优先级计算公式为pr
2026-07-30 18:35:01
210
14
原创 Linux 七大进程状态
进程只有被操作系统管理好了,才能发挥它的全部作用 ,而系统中存在多个进程,操作系统无法做到面面俱到,因此为了更好的管理进程,操作系统把进程运行 阻塞 挂起 休眠等等。至于每种状态的 应用场景是什么?有什么用?本文将会带大家认识各种进程状态在谈进程状态之前,我们需要了解什么是进程怎么去描述并组织进程如何创建一个进程。操作系统(OS)的本质是:先描述,在组织操作系统并非直接管理 --进程,而是管理进程 的 PCB(task_struct)PCBPID、PPID 、进程状态等我们可以通过函数。
2026-07-30 11:43:29
269
22
原创 进程创建(fork函数|进程创建原理)
本文详细介绍了Linux系统中进程创建的机制,重点解析了fork()函数的原理和使用。主要内容包括:1. 进程创建原理:子进程由父进程创建,可以复制父进程或装入新程序;2. fork()函数详解:创建子进程,父子进程共享代码但数据独立(写时拷贝);3. fork()特性:返回两次(父进程返回子进程PID,子进程返回0);4. 父子进程关系:共享代码数据,修改时进行写时拷贝;5. 进程独立性:通过不同PCB实现数据隔离。文章通过代码示例和理论分析,深入浅出地讲解了进程创建的核心机制。
2026-07-25 14:17:49
204
19
原创 Linux进程(WHAT HOW)
本文摘要: 文章探讨了操作系统中的进程管理机制。进程是正在运行的程序实例,由代码、数据和进程控制块(PCB)组成。Linux中的PCB是task_struct结构体,包含进程标识符、状态、优先级等信息。操作系统通过双向链表组织PCB,将进程管理转化为对链表的增删查改操作。文章通过示例代码展示了如何查看进程信息,包括使用ps命令和/proc目录,并介绍了获取进程标识符(PID)和父进程标识符(PPID)的系统调用getpid()和getppid()。最后解释了Bash作为父进程与子进程的关系,类比资本家和实习
2026-07-23 22:30:42
470
32
原创 【Linux系统编程】冯 • 诺依曼体系结构
本文介绍了Linux系统编程的基础——冯·诺依曼体系结构。该体系由输入设备、存储器、运算器、控制器和输出设备五部分组成,通过内存作为中介解决外设与CPU速度不匹配的问题。文章详细阐述了数据在计算机中的流动过程,从输入设备到内存,经CPU处理后再输出,并以网络通信为例说明该体系的实际应用。理解这一体系结构是掌握系统编程的关键,它解释了为何程序需加载到内存执行以及操作系统启动时需要预加载的原因。
2026-07-14 19:53:47
226
4
原创 【Linux】自动化编译工具——make/makefile
本文介绍了Linux中使用Make/Makefile实现C语言项目自动化构建的方法。主要内容包括: Makefile的作用:记录编译规则,实现"自动化编译",提高开发效率; Makefile基本语法结构:目标文件、依赖文件列表和执行命令的编写格式; 简单项目的Makefile编写示例,展示从源文件到可执行文件的完整构建流程; 进阶技巧:使用变量和通配符简化重复内容,以及.PHONY伪目标的应用; Makefile的核心优势:增量编译机制,只重新编译修改过的文件,显著提升大型项目的编译效率
2026-07-14 19:19:41
295
9
原创 滑动窗口:定长滑动窗口与不定长滑动窗口
本文补充了滑动窗口算法的定长类型实现,重点介绍了"入-更新答案-出"的模板套路。通过LeetCode 1456题展示了两种解法,分析第二种方法在内存和时间上的优势。文章详细解释了窗口左右端点位置的计算原理(L=R-k+1),并提供了多个定长滑动窗口的典型题目解法(643、1343、2090等题),涵盖最大平均数、满足条件的子数组数目、最少涂色次数等问题。最后简要提到不定长滑动窗口的三种类型(最长子数组、最短子数组、子数组个数),表示后续将补充动态规划相关内容。
2026-06-09 19:59:54
222
2
原创 Linux权限深入解读
本文摘要: Linux系统权限管理主要涉及用户分类(root超级用户和普通用户)、文件访问者角色(拥有者/所属组/other)和文件权限属性(r/w/x)。权限通过字符或8进制表示,可使用chmod/chown/chgrp命令修改。root用户不受权限限制,普通用户操作需sudo提权。文件默认权限受umask掩码影响(权限=默认值&(~umask))。目录权限中,可执行权限x决定能否进入目录。特殊粘滞位(+t)可使目录下的文件仅允许root、目录所有者或文件所有者删除。
2026-06-01 18:23:34
465
53
原创 Linux基础:环境配置||基础指令
Linux是一种开源操作系统,其内核由林纳斯·托瓦兹于1991年首次发布。本文介绍了Linux环境搭建、常用指令及文件操作。推荐使用云服务器配合XShell远程连接,详细讲解了ls、cd、pwd等基础指令,以及文件创建(touch)、目录操作(mkdir/rmdir/rm)、文本查看(cat/more/less)等实用命令。重点说明了路径概念、重定向操作和管道用法,并介绍了时间(date/cal)、查找(find/grep)、压缩(zip/tar)等高级功能。文章还包含热键使用和文件传输技巧,为Linux初
2026-05-27 19:54:40
501
20
原创 从入门到入土:二分查找算法
本文系统介绍了二分查找算法及其应用。首先阐述了二分查找的核心思想:通过比较中间元素与目标值,每次排除一半元素,实现O(logn)的时间复杂度。重点讲解了两种模板:朴素模板用于查找目标值是否存在,特殊模板用于查找边界值(左/右端点)。针对特殊模板,详细说明了中点取值和边界更新的关键点,并通过LeetCode例题(34、35、852等)展示了如何根据问题特性选择合适的模板。文章还强调了识别"二段性"的重要性,这是应用二分查找的前提条件。最后提供了多个经典问题的代码实现,帮助读者掌握二分查找的
2026-05-23 21:56:07
503
16
原创 C++11:列表初始化||右值和移动语义||引用折叠和完美转发||可变参数模板||lambda表达式||包装器(function bind)
C++11新特性摘要:C++11引入了约140个新特性,显著提升了系统开发效率和安全性。核心改进包括:1. 统一的列表初始化语法,支持自定义类型;2. 右值引用和移动语义,减少不必要的拷贝;3. 可变参数模板,支持参数包扩展;4. Lambda表达式简化匿名函数编写;5. function和bind包装器实现灵活回调机制。这些特性优化了内存管理、模板编程和函数式编程能力,使C++更适合现代软件开发需求。
2026-05-13 22:38:39
424
9
原创 LeetCode 滑动窗口个人思路详解
滑动窗口是一种高效的双指针算法,用于解决数组/字符串中的连续子序列问题。它通过维护一个可变大小的窗口(由左右指针界定),在单次遍历中将时间复杂度从O(n²)优化到O(n)。核心步骤包括:入窗(右指针扩展)、条件判断、更新结果、出窗(左指针收缩)。典型应用包括:求最小/最大子数组长度(如LCR008)、无重复字符的最长子串(LeetCode 3)、含最多K个0的连续1(LeetCode 1004)、字母异位词查找(LeetCode 438)和最小覆盖子串(LeetCode 76)。算法通过哈希表辅助统计字符频
2026-05-10 00:38:37
569
11
原创 哈希表(HashTable,散列表)个人理解
哈希表是一种高效的数据结构,通过哈希函数将键映射到数组索引,实现O(1)时间复杂度的基本操作。其核心由数组、哈希函数和冲突解决机制组成:哈希函数将任意类型键转换为固定范围的整数索引,当不同键映射到同一位置时会产生哈希冲突。主要解决方法包括开放定址法和链地址法。负载因子衡量哈希表填充程度,通常设置为0.75以平衡空间利用率和冲突概率。实现时需要考虑扩容机制,当元素数量超过阈值时将数组容量翻倍并重新哈希所有元素。对于非整型键,需设计专门的哈希函数(如字符串的BKDR算法)。哈希表通过巧妙的设计实现了高效的数据存
2026-05-09 18:10:17
427
3
原创 AVL树:旋转||平衡因子
AVL树是一种自平衡二叉搜索树,通过平衡因子(BF)确保任意节点左右子树高度差不超过1。当插入节点导致BF绝对值超过1时,会触发四种旋转操作:LL型(右单旋)、RR型(左单旋)、LR型(先左旋后右旋)和RL型(先右旋后左旋)。插入过程遵循二叉搜索树规则,插入后需向上更新平衡因子,若失衡则通过相应旋转恢复平衡。旋转操作会调整树结构并重新计算节点平衡因子,从而维持AVL树的高度平衡特性,保证O(log n)的查询效率。
2026-05-06 15:28:37
438
6
原创 Map类:pair键值对|map的基本操作|operator[]
STL是map的关联式容器,按照特定顺序存储关联,由和组合而成的元素它们组合成Key通常用于排序和唯一的表示元素value中存贮与key关联的内容key和value的类型额可以不同,在map内部,key和value通过成员类型value_type绑定实际上就是基于红黑树,是一种自平衡的二叉搜索树,能确保在插入和删除元素时维持良好的性能。map 通常被实现为,更准确地说是(红黑树)底层基于,是一种自平衡的二叉搜索树,能确保在插入和删除元素时维持良好的性能。
2026-04-28 22:20:06
480
6
原创 Set类:关联式容器|pair<>|lower_bound|upper_bound
STL中的set是一种关联式容器,基于红黑树实现,具有自动排序和去重功能。它支持高效的查找(O(logn))、插入和删除操作,适用于需要维护唯一有序数据的场景。set提供了一系列接口如insert、erase、find、count等,还包含lower_bound和upper_bound用于区间查找。与序列式容器vector相比,set在查找和插入效率上更优,但牺牲了随机访问能力。set常用于需要快速检索且元素唯一的应用场景,如字典、索引等。其键值对结构和自动排序特性使其成为处理有序不重复数据的理想选择。
2026-04-28 00:14:19
446
4
原创 C++ 多态(多态定义 多态应用 多态底层||final override关键字||抽象类)
多态是面向对象编程的三大特性之一,实现"一个接口,多种方法"的功能。多态分为编译时多态(函数重载、模板)和运行时多态(虚函数机制)。运行时多态通过虚函数重写实现,需满足:子类虚函数重写父类虚函数(三同:函数名、参数、返回值相同);必须通过父类指针或引用调用。虚函数重写允许协变返回类型(返回父子类关系的类型)。析构函数建议声明为虚函数,防止基类指针删除子类对象时内存泄漏。C++11引入override明确重写,final禁止重写或继承。抽象类含纯虚函数(=0),不能实例化,子类必须重写才能
2026-04-22 16:15:10
602
10
原创 C++继承解析(派生类函数/单多继承/虚拟继承/组合)
本文系统介绍了C++继承机制的核心概念与应用。主要内容包括:1. 继承的基本概念与权限控制(public/protected/private继承);2. 派生类与基类的关系,包括对象赋值转换、作用域规则和静态成员继承;3. 派生类默认成员函数的实现要点(构造/拷贝构造/赋值重载/析构);4. 多继承中的菱形继承问题及虚拟继承解决方案;5. 继承与组合的设计选择原则,强调优先使用组合以降低耦合度。文章通过代码示例详细说明了继承体系中的关键特性和最佳实践,为面向对象程序设计提供了重要指导。
2026-04-20 23:40:59
434
6
原创 栈 队列 优先级队列 深入浅出讲解
栈(Stack)是一种特殊的数据结构,也是一种容器适配器先进后出(LIFO)进行插入和删除的一端,叫做栈顶,另一端为栈底。栈在原则上不允许进行中部和底部的操作,这样会破坏栈结构的完整性,栈是遍历不是由迭代器来实现的栈(Stack)是作为容器适配器被实现的,容器适配器是对特定类封装作为其底层容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层如图所示,我们可以看到,栈有两个模板参数T栈中的元素类型,同时也是底层容器中的元素类型Container实现栈时用到的底层容器,这里为缺省参数,缺省结构为。
2026-04-08 21:04:32
545
4
原创 STL list
这里的typename可以是任何基本类型,例如int、double、char、结构体等,也可以是STL标准容器,例如等。注意:使用前必须加上头文件:int main()int a[3];// 正常定义的-----静态数组// list 定义的 int类型的链表char b[3];return 0;
2026-04-06 15:05:15
604
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅