自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 多线程文件拷贝:从原理到实现的完整指南

本文介绍了多线程文件拷贝技术的实现原理与优化方法。通过将大文件分割成多个块并行处理,多线程拷贝能显著提升传输效率(实测提升25-40%)。讲解了基于POSIX线程的C语言实现方案,包括核心结构定义、线程任务分配、同步控制等关键步骤,并给出完整的示例代码。分析了常见问题如虚假唤醒、边界处理等注意事项,该技术特别适用于处理大文件或海量小文件传输场景。

2025-11-17 23:11:51 1168

原创 (下册)TCP 套接字底层原理与进阶优化

维度上册(基础版)下册(优化版)并发能力单客户端(阻塞)多客户端(epoll 并发)端口复用不支持(重启报错)支持(SO_REUSEADDR)IO 模型阻塞 IO非阻塞 IO + epoll 多路复用错误处理基础完善(文件、连接、事件)适用场景学习 / 测试生产环境 / 高并发场景以上便是TCP 服务器端的基础流程+内核底层机制的全部内容了,如果有不对或者有疏漏的地方,欢迎在评论区留言,或者私信我。

2025-11-22 23:15:00 859

原创 (上册)TCP 服务器核心流程实操指南

本文深入解析TCP服务器核心工作流程,通过C语言代码示例演示了socket()创建套接字、bind()绑定地址、listen()监听连接、accept()接收连接和read()/write()数据交互五个关键步骤。重点剖析了每个API调用的底层原理,包括内核资源分配、连接队列管理、字节序转换等关键技术细节。文章还解答了常见问题如端口占用处理、队列溢出预防等,并指出实际开发中需要考虑并发处理机制。掌握这些原理能帮助开发者构建更健壮、高效的TCP服务器应用。

2025-11-22 18:18:41 1130 2

原创 从入门到实战:18个经典例题吃透正则表达式

摘要:本文系统讲解正则表达式核心原理与应用技巧,涵盖18个典型场景实战案例。从基础符号^$.[]*+?等入门,逐步深入IP地址、端口号等复杂匹配模式。重点解析分组逻辑、预定义类和边界控制,强调完全匹配与部分匹配的区别,并提供常用正则速查表。通过分段设计、在线工具验证等方法,帮助读者快速掌握这项文本处理的"瑞士军刀"技术,同时提醒避免过度依赖正则,应结合编程逻辑实现复杂规则验证。

2025-11-20 00:15:46 591

原创 Linux共享内存编程详解:shm_open与mmap函数实战指南

共享内存是Linux IPC中效率最高的方式,核心依赖shm_open(创建对象)、ftruncate(设置大小)、mmap(内存映射)三个关键步骤。通过本文的函数解析和实战示例,相信大家已掌握共享内存的基本使用方法。实际开发中,共享内存常与同步机制结合使用,适用于大数据量、低延迟的进程间通信场景(如实时数据传输、多进程协作计算等)。如果在使用过程中遇到问题,可通过man 2 函数名(如man 2 mmap)查看系统手册获取更详细的说明。

2025-11-18 23:25:23 1042

原创 从理论到实践:TCP网络通信全解析与代码实现

本文从网络通信的基础概念出发,讲解了IP与端口的定位机制、五层网络架构的协同逻辑,以及TCP协议的完整实现流程。网络通信的核心在于“分层封装”与“协议约定”,理解这一思想,能帮助我们更好地排查开发中的网络问题(如连接失败、数据丢失等)。后续学习中,大家可以进一步拓展:深入理解TCP协议的三次握手与四次挥手机制,掌握可靠传输的底层原理;实现多客户端并发处理(如使用多线程、IO多路复用);对比UDP协议与TCP协议的差异,根据业务场景选择合适的传输协议。

2025-11-18 00:56:26 1020

原创 STM32F407 GPIO深度解析:从底层架构到实战应用

本文深入解析STM32F407的GPIO架构及应用,主要涵盖:1)底层架构原理,包括总线连接、寄存器机制和存储映射;2)GPIO功能详解,分析8种工作模式及硬件结构;3)实战配置方法,展示寄存器直接操作、标准库和HAL库三种实现方式;4)进阶应用,介绍中断和DMA功能实现;5)常见问题与优化建议。文章从理论到实践系统梳理了GPIO开发要点,为嵌入式开发者提供了全面的技术指南和工程实践参考。

2025-11-15 23:55:37 969

原创 信号在进程(线程)间通信

SIGALRM。

2025-11-12 01:19:42 979

原创 sendfile函数与传统 read+write 拷贝相比的优势

sendfile是Linux提供的零拷贝系统调用,用于高效传输数据。它通过在内核态直接完成文件描述符间的数据传输,避免了用户态与内核态间的数据拷贝,大幅提升性能。相比传统read+write方式(4次拷贝+2次切换),sendfile只需2次拷贝+1次调用。关键特性包括:输入文件必须是可映射文件(普通文件或块设备),输出可以是文件或TCP套接字;支持大文件传输;典型应用场景包括本地文件拷贝和网络服务器发送静态文件。使用时需注意参数限制、错误处理和平台兼容性问题,特别适合大文件传输和高并发场景。

2025-11-11 22:48:17 896

原创 进程之间的通信方式

通信方式数据形式同步 / 异步效率适用场景亲缘性要求匿名管道字节流同步中父子进程简单流式通信必须亲缘命名管道字节流同步中无亲缘进程流式通信无信号量无(同步工具)高共享资源互斥 / 同步无消息队列结构化消息(带类型)异步中结构化、异步通信无共享内存任意结构需手动同步极高(零拷贝)高性能、大数据量通信无信号事件通知(整数)异步高(轻量)异常处理、进程控制无简单流式通信:管道(匿名 / 命名);同步 / 互斥:信号量;

2025-11-09 01:16:44 833

原创 快速排序的常见构思

快速排序三种常用划分区域的函数,1、直接取最左/右元素作为基准值;2、三元素取中法;3、快慢指针划分区域法

2025-11-09 00:21:29 626

原创 进程控制核心(含进程地址空间)

本文系统阐述了进程控制的核心机制。首先介绍了进程地址空间的组成,包括代码段、数据段、堆和栈等关键区域的功能特性。其次详细解析了系统调用的层级架构和设计原理,强调了其安全性和抽象价值。重点讨论了进程创建(fork)与写时拷贝技术、进程退出(exit)与资源清理、进程等待(wait)与僵尸进程避免等关键操作。最后阐述了进程替换(exec)的功能特点及其常见应用场景。全文揭示了进程生命周期管理的核心技术,包括地址空间管理、PCB控制、系统调用接口等要素,为深入理解操作系统进程机制提供了系统性框架。

2025-11-06 22:03:03 680

原创 Git创建合并分支、多人协作

除了git add、git commit、git push、git pull等基础操作,我们也要了解掌握以下关于git的几种常见功能。

2025-11-03 13:41:13 673

原创 选择排序优化

选择排序回顾以及如何对选择排序进行优化

2025-11-01 13:56:39 396

原创 C语言中的文件IO操作(标准I/O库函数)

例如:FILEfilefopen"io.txt""a+"//注意:下文中的变量 file 就是在这里定义的;/*** 作用:打开文件* 参数1: 文件路径 字符串* 参数2:打开文件的模式 字符串* r 读模式 文件不存在失败* w 覆盖写模式 文件不存在自动创建* a 追加写模式 文件不存在自动创建* r+ 可读 + 可写,从头开始写一个字符替换一个* w+ 覆盖写 + 可读* a+ 追加写 + 可读* 返回值。

2025-11-01 00:17:24 1132

原创 解决负权值图:贝尔曼福特算法

前情提要:迪杰斯特拉算法上一篇文章我们的最短路径规划只能解决非负权值图的最短路径,如果有负权值我们该如何解决?

2025-10-30 01:45:38 670

原创 迪杰斯特拉(dijkstra)算法

第一层for循环是在集合v中寻找最短路径,添加到集合U(sptSet数组)中,设置对应下标元素为true,表示已经添加,第二段代码进行松弛操作,将符合要求的顶点更新:顶点不在集合U中,顶点v到顶点j之间存在一条有向路径(因为添加到集合U中的一个顶点对应下标为v,如果v和下标j之间有一条路径,进行第三条判断),最短路径(源点->下标v顶点)+ 下标v顶点->下标j顶点 距离之和小于 源点直接->下标j顶点的距离,就更新集合V,(因为下次还从集合V中选),每添加一个顶点到U集合以后,更新源点到V集合(

2025-10-29 23:51:47 1037

原创 克鲁斯卡尔(Kruskal)算法

在了解kruskal算法之前我们先了解一下并查集的一些概念,并查集会有一些可以优化的方法,这里我们只是简单说明不进行详细解释。

2025-10-27 01:30:12 707

原创 最小生成树代码

Prim最小生成树

2025-10-26 15:15:59 1008

原创 深入理解进程的实现过程

在了解进程之前,我们先要搞清楚一些基本概念:计算机体系结构、操作系统、物理内存和虚拟内存地址空间,然后才能深入理解进程的实现过程。

2025-10-25 01:27:07 788

原创 Makefile 与 make常用指令

定义变量CC = gcc # 指定编译器CFLAGS = -Wall -g # 编译选项:所有警告 + 调试信息SRC = main.c func1.c func2.c # 源文件列表OBJ = $(patsubst %.c, %.o, $(SRC)) # 将.c文件替换为.o文件TARGET = myprogram # 目标可执行文件名patsubst$(patsubst 模式, 替换, 字符串);OBJ只是字符串赋值,不执行实际操作。

2025-10-22 13:17:55 192

原创 gitbash链接远程仓库时,出现的ssh密钥链接问题

gitbash远程拉取仓库时,出现的密钥问题

2025-10-21 22:19:55 176

原创 图(邻接表、邻接矩阵)的广度优先遍历

邻接矩阵、邻接表的广度优先遍历C语言代码逻辑

2025-10-21 21:59:14 1224

原创 图(邻接矩阵、邻接表)的深度优先遍历

注意:这里以邻接矩阵和邻接表为例,具体结构是依靠递归、递推(循环)方法实现。图的结构这里定义的是无向图,有向图原理类似,可以自己稍作改动,这里只讲代码基本原理。

2025-10-21 20:02:09 910

原创 Git的常见指令

git clean -n # 预览将被删除的文件。git clean -f # 删除未跟踪文件。这些是 Git 日常开发中最常用的命令,掌握它们可以应对大部分版本控制场景。可以在实际项目中多练习使用,对以后的工作和学习有所帮助。# 编辑 .gitignore 文件。

2025-10-20 19:40:37 218

原创 图-邻接表、邻接矩阵C语言

极大连通子图:极大指的是将图G的任何一个不在子图G1中的顶点加入之后,子图G1不再连通;极小连通子图:指的是连通图G中的连通子图,极小指的是删除这个图中的任意一条边,这个子图不再连通。连通分量:无向图的极大连通子图,称为连通分量;生成树:包含无向图G中所有顶点的极小连通子图;最小生成树:路径长度之和最小的生成树,就是最小生成树。常见存储结构:邻接矩阵、邻接表、边列表、关联矩阵、前向星、邻接多重表、十字链表……

2025-10-20 01:55:47 988

原创 C语言小项目:五子棋(三)

首先,我们可以利用排序,让他从鼠标所下的点的前4位,判断颜色是否连续相等,我们将FLAG%2==1的条件设为黑棋胜利,将FLAG%2!这里的变量temp就是为了作为一个标志,判断连成的棋子颜色是否一致。四种排列方式:竖线,横线,左上到右下,右上到左下;

2025-06-10 02:00:00 399

原创 C语言项目:五子棋(二)

用C语言做一个小游戏

2025-06-09 00:00:00 437

原创 C语言项目:五子棋(一)

用C语言做一个五子棋小游戏

2025-06-08 16:05:00 909

原创 (dijkstra,最短路径问题)3341. 到达最后一个房间的最少时间 I

假设你当前处于时间t,想要移动到相邻格子(nx,ny):如果当前时间t已经大于等于moveTime[nx][ny],那么你可以立即移动过去,到达时间是t + 1,如果当前时间t小于moveTime[nx][ny],那么你必须等待,直到时间达到moveTime[nx][ny]才能进入,到达时间是moveTime[nx][ny] + 1。如果当前时间t小于moveTime[nx][ny],那么你必须等待,直到时间达到moveTime[nx][ny]才能进入,到达时间是moveTime[nx][ny] + 1。

2025-05-12 01:42:45 819

原创 Dijkstra算法简要-个人理解

对于到顶点1的边,v = 1,weight = 10,由于 dist[0] + 10 = 0 + 10 = 10 < dist[1](此时 dist[1] 是无穷大),就是存储Edge类型的二维数组,变量名叫graph,至于vector,是C++库函数中的一个类似快捷创建动态数组的一个函数名,具体用法可以AI搜一下。对于到顶点2的边,v = 2,weight = 3,因为 dist[0] + 3 = 0 + 3 = 3 < dist[2](此时 dist[2] 是无穷大),,分别表示第一个和第二个元素。

2025-05-09 00:44:32 1115

原创 快速排序及优化方法

先设置好大框架,while(x<y),这里选择序列最左边的元素为基准值,所以先从序列的右边和这个基准值进行比较(我们将这个序列按从小到大的顺序输出), 如果右边arr[y]比基准值小,我们就将y--,然后继续与基准值比较,直到找到小于它的元素,然后跳出循环,进入if判断语句,向这里if后面的语句分为两步理解,先赋值,后++,arr[x]=arr[y],x++;具体类似无监督插入排序,简单的理解就是优化判断条件,减少判断条件次数 ,优化分区代码执行过程中的判断条件,减少判断次数,进而减少算法的运行时间。

2025-04-26 21:42:11 586

原创 哈希查找的代码(C++,C版),以及哈希函数的使用

char *s;}Node;Node *data;}Hashtable;首先,Node就是一个节点类型的结构体,用来作为哈希表的一个单元格,其次Hashtable就是哈希表结构体,Node结构体里面的next后面会用来作为一个解决哈希冲突的办法,hashtable里的data就是定义一个Node类型的数组,用data指针指着,其中cnt是用来记录数组data存储多少元素,size是用来定义这个Hashtable有多少个存储单元,即多少个Node结点。return p;

2025-04-18 00:54:06 748

原创 希尔排序(二)——Hibbard增量序列

增量过大,超过数组长度的一定比例(如超过一半),可能会过度打乱数组元素之间的相对顺序。这可能破坏一些已经部分有序的子结构,使得后续的排序工作更加困难。超过数组长度的一定比例(如超过一半),可能会过度打乱数组元素之间的相对顺序。这可能破坏一些已经部分有序的子结构,使得后续的排序工作更加困难。一般情况Hibbard应用在希尔排序里面,达到的时间效率更趋于稳定。例如:1,3,7,15,……(后面还会再次提到)

2025-04-11 00:24:06 1195

原创 希尔排序两种时间复杂度(一)

(考研同学注意,只要某个题或是选项说希尔排序的时间复杂度固定为***的时候,一定是错的。# n为待排序序列的长度,O(n²):希尔增量序列 n/2、n/4、n/8、n/16、……O(n^1.5)1.5次方 Hibbard增量序列:1、3、7、……-1 ……虽然只减少了0.5次方,但是在数据很大的情况,会减少很多时间。

2025-04-10 01:50:20 731

原创 1、插入排序变无监督的插入排序

只有当前元素调整到第一位的时候他才生效,进行一个预处理,将全局最小值放到第一位,后面的部分在进行插入排序,再执行插入排序的时候,任何元素都不会被调整到第一位上,那么'j>i'的条件就可以去掉了。因为,直接插入排序是一个稳定排序算法,所以直接交换有可能使得交换排序算法不稳定,就不能被单纯的认为是一个插入排序,所以在记录好下标位置后,进行一步一步的交换。1、这个条件只有当前元素调整到当前元素的第一个位置的时候,这个判断条件才能生效;作用:防止下标访问越界,防止i-1越界,被称为。最后实现无监督的插入排序。

2025-04-10 00:08:48 332

原创 第五周-函数

1、如果被调函数有返回值,主函数需要定义一个与返回值类型相同的变量,去接收被调函数的返回值。①如果函数返回值类型与return后的数据类型不一致,以函数声明时的返回值类型为准;将实参的值传进形参中(相当于传递的是实参的复制体),对于形参的改变不会影响实参;分配栈空间:给被调函数中出现的变量分配栈空间,这个栈空间有一个专有名词叫栈帧。函数返回值可以返回函数的运行状态,也可以返回要告知外界的信息。如果没有写函数返回值类型,默认函数返回值类型为int型。如果没有返回值信息,函数的返回值类型写为void。

2025-03-30 21:00:00 259

原创 第四周字符串常用函数

原型:int strcmp(const char* str1,const char* str2)注意:当字符串存在多个拆分标志的时候,对于delim这个参数写的时候,可以不用在乎分隔符的顺序。返回值:返回值是一个指针,指向被分割的字符串,当最后一次调用找不到分隔符时,会返回为NULL。base:要转换的进制基数,比如要转换为十进制,基数就是10,要转换为2进制,基数就是2。函数原型:char* strtok(char* str,char* delim)printf("十进制字符串:%s\n", str);

2025-03-30 17:06:54 508

原创 3.字符串作业

【代码】3.字符串作业。

2025-03-30 16:42:04 105

空空如也

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

TA关注的人

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