自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网页 HTML 基础入门:从基本结构到表单实战

HTML 是网页开发的第一步,掌握基本结构、常用标签、超链接、图片和表单后,就可以独立写出简单的静态页面。先熟悉 HTML 基本结构,养成规范书写习惯。练习常用标签,尤其是链接、图片和表单。遇到不熟悉的标签,随时查阅 W3School 手册。掌握 HTML 之后,可以继续学习 CSS 美化页面,以及 JavaScript 实现交互,逐步进入完整的前端开发领域。

2026-11-10 20:19:10 167

原创 Linux C 编程之 SQLite 数据库入门(从终端指令到 C API)

数据库就是数据的仓库(假设数据是海量的)。数据库可以储存数据,并提供对数据的统计和相关管理,也就是常说的增删改查(CRUD)。嵌入式设备上也可以使用数据库。库 --> 表(行、列)--> 记录(行)--> 字段(列)库:整个仓库,对应一个.db文件(SQLite 中)表:仓库里的一张张表格记录:表里的一行字段:表里的一列SQLite =一个文件 + 一个函数库,open → exec → close 三步走终端点命令(开头不带分号)和 SQL 语句(必须分号结尾)要分清查询靠回调函数。

2026-11-09 21:02:19 255

原创 Linux 网络编程:IO 多路复用 select 与 epoll 详解

IO 多路复用是指:单线程或单进程同时监测若干个文件描述符是否可以执行 IO 操作的能力。在 TCP Server 中使用,处理多个客户端的请求;对多个会阻塞的设备进行 IO 操作,哪个设备的数据先就绪(可读或可写),就及时处理。简单来说,在没有 IO 多路复用之前,一个服务器如果要同时服务多个客户端,往往需要为每个连接创建线程或进程;而借助 select / epoll,单线程就能"同时"监听多个文件描述符,大大降低了资源开销。IO 多路复用是 Linux 网络编程中处理高并发连接的核心技术。

2026-11-09 09:17:31 308

原创 C 语言网络编程实战:协议头、封包拆包与 HTTP 通信全解析

大端序:高位字节放在低地址。小端序:低位字节放在低地址。以0x12345678printf("内存中的字节序: ");i < 4;i++) {// x86 通常输出: 78 56 34 12 (小端)return 0;TCP 是字节流协议,不保证「一次 recv 收到一个完整包」,所以应用层必须自定边界。/* 自定义应用层协议头:魔数 + 长度 + 类型 */0x41544350/* 魔数,用于快速识别 *//* 包类型 *//* 负载长度(不含头) */

2026-11-06 09:13:44 490

原创 UDP 与 TCP 协议详解:从原理到实战

TCP以可靠性为核心,通过三次握手、四次挥手、确认重传、流量控制和拥塞控制等机制,为应用提供了可靠的字节流传输服务,适用于对数据完整性要求高的场景。UDP以效率和低延迟为核心,凭借极小的头部开销、无连接设计和数据报传输方式,在实时音视频、在线游戏、DNS 等场景中发挥着不可替代的作用。理解这两个协议的本质区别,不仅有助于我们在实际开发中做出正确的技术选择,更是深入掌握网络编程和系统设计的基石。希望本文能帮助你建立起对 TCP 与 UDP 的系统认知。

2026-11-05 11:23:12 501

原创 Linux IPC 进程间通信:信号通信与共享内存详解

信号是 Linux 提供的一种异步事件通知机制。执行默认动作(如终止进程);忽略该信号;调用自定义的信号处理函数。信号本质上是“软件中断”,只传递一个编号,几乎不携带额外数据。因此它适合用来通知进程“发生了什么”,而不是传输大量数据。共享内存允许两个或多个进程访问同一块物理内存区域。由于进程之间不需要经过内核中转数据(区别于管道、消息队列的多次拷贝),共享内存是速度最快的 IPC 方式,特别适合大数据量的高频交换。但共享内存本身不提供同步机制:多个进程同时读写同一块内存可能产生竞争条件。

2026-11-02 09:17:00 695

原创 Linux 进程间通信:无名管道与有名管道详解

进程是操作系统分配资源的基本单位。为了保证安全性,操作系统为每个进程分配了独立的虚拟地址空间,一个进程无法直接读取或修改另一个进程的内存。当多个进程需要协同工作时,就必须通过操作系统提供的 IPC 机制来交换数据。无名管道,也称匿名管道,是 Unix/Linux 中最简单的 IPC 机制。它的本质是内核维护的一块环形缓冲区fd[0]:读端,用于从管道读取数据fd[1]:写端,用于向管道写入数据数据在管道中按先进先出的顺序流动,写入的数据只能被读取一次。有名管道,也称 FIFO,是一种。

2026-10-30 21:04:28 390

原创 Linux 多线程核心知识精华全总结:基础概念、POSIX API、互斥同步与死锁

Linux 中线程是轻量级进程(LWP),线程必须隶属于某一个进程,不能独立存在。进程:操作系统最小的资源分配单位,拥有独立的地址空间、文件描述符等完整资源。线程:操作系统最小的执行/调度单位,是进程内部的一条执行流。一个进程内默认存在一条线程,即主线程;同一进程内的多个线程是平级关系。sem_t sem;由于锁资源申请与释放逻辑不合理,导致多个线程/进程相互等待对方持有的资源,从而都无法继续向前执行的现象。理解线程本质是轻量级进程,共享进程资源、仅栈独立;

2026-10-28 21:02:39 509

原创 Linux进程管理:进程空间回收与exec函数族详解

后缀 l:参数以列表形式逐个传递,最后以NULL结尾后缀 v:参数封装在指针数组中传递后缀 p:自动搜索PATH环境变量,可直接写程序名(如"ls"),不用写完整路径后缀 e:可以显式传递环境变量数组envp进程回收子进程退出后 PCB 残留 → 僵尸进程wait:阻塞回收任意子进程waitpid:可指定进程、支持非阻塞配合宏解析退出状态程序替换exec 函数族:在当前进程空间运行新程序,PID 不变六个函数根据后缀区分参数形式和查找方式,最常用的是execlp和execvp。

2026-10-27 17:42:00 558

原创 Linux进程核心考点精要

进程是程序的一次动态执行过程,区别于磁盘上静态的二进制文件(如a.out操作系统通过(Linux 中为结构体)对进程进行全生命周期管理。

2026-10-26 22:41:54 489

原创 系统编程中的文件 I/O:标准 IO 与系统调用

系统编程关注的是如何直接与操作系统打交道,其中「文件 I/O」是最核心的主题之一。在操作系统眼里,文件不仅是磁盘上的普通文件,还包括管道、套接字、设备、终端等,几乎一切输入输出对象都被抽象为「文件」。为什么printf和write的性能差异巨大?什么是用户态缓冲与内核态缓冲?为什么高性能 Web 服务器强调零拷贝?阻塞与非阻塞、同步与异步到底有什么区别?本文以 Linux/C 环境为主,从最底层的系统调用出发,逐步深入缓冲区、I/O 模型与零拷贝技术。

2026-10-21 21:10:59 638

原创 C 语言系统编程:标准 I/O 库函数 fopen、fputc、fgetc、fputs、fgets 详解

函数作用向指定流做格式化输出从指定流做格式化输入按块读取数据按块写入数据移动文件读写位置获取当前读写位置回到文件开头刷新缓冲区,强制写出数据删除文件重命名文件这部分内容相对独立,可以根据需要展开学习。fopenfclose负责打开与关闭文件流;fgetcfputc负责单个字符的读写;fgetsfputs负责字符串(行)的读写;配合feofferror可以精准判断读写状态;关键是要重视返回值检查与资源释放,写出健壮、可维护的系统级 C 程序。建议读者把本文示例亲手编译运行一遍,再尝试用。

2026-10-20 21:04:39 548

原创 C 语言数据结构终章:树、二叉树与哈希表

树(Tree)是由n(n >= 0)个结点组成的有限集合当n = 0时,称为空树;当n > 0时,有且仅有一个称为根(Root)的结点,其余结点可分为m个互不相交的有限集合,每个集合本身又是一棵树,称为根的子树(Subtree)。可以看出,树的定义是递归的——这也暗示了树的几乎所有操作都可以用递归优雅地实现。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;

2026-10-19 21:12:18 593

原创 链表栈队列C语言实现精解

(链表实现,天然动态)。顺序栈在嵌入式或性能敏感场景中更常见,因为内存连续且无额外指针开销。与高级语言不同,C 语言没有内置的容器类,必须手动定义结构体并管理节点的生命周期。C 语言中的链表通过结构体自引用实现。单链表是最基础的形式,双链表则增加了。是解决数组队列“假溢出”问题的标准方案。在 C 语言中,链表、栈和队列的实现高度依赖。指针以支持反向遍历,但增加了维护成本。1. 链表 (Linked List)(数组实现,需注意扩容)和。3. 队列 (Queue)2. 栈 (Stack)

2026-10-18 12:15:01 385

原创 数据结构链表全解析:单向/双向、循环/非循环、增删查与全破坏

链表通过“节点 + 指针”的方式把数据串联起来,插入、删除只需修改指针指向,不需要移动其他元素,在频繁增删的场景下优势明显。本文用 C 语言从零实现这些链表,覆盖头插、尾插、头删、尾删、按关键字删除以及链表整体销毁等全部核心操作。双向链表每个节点同时保存前驱和后继指针,可以从两个方向遍历,删除节点时无需维护“前一个节点”的额外指针。日常开发中先确认“哪个指针为 NULL”“哪个节点已经被 free”“哪里多解引用了一次”,再逐个修正。,所以头插、头删、按关键字删除都要反复判断“是不是第一个节点”。

2026-10-16 19:53:08 785

原创 数据结构入门:逻辑结构、存储结构与链表详解

刚开始接触数据结构时,很多同学容易被「逻辑结构」「存储结构」「链表」这些概念绕晕。逻辑结构描述数据元素之间的关系,存储结构描述这些关系在计算机里如何存放。而链表,正是「链式存储结构」下最常见、最基础的一种实现方式。本文假设你已经了解了数据结构的基本概念,并接触过「关系」和「存储结构」这两个词,我们重点把它们串起来,再把链表彻底讲透。

2026-10-14 09:10:41 535

原创 C语言最终篇:位运算

位运算是C语言中一种高效的操作方式,它直接对数据的二进制位进行操作。位运算在系统软件开发、嵌入式编程和性能优化中具有重要作用。

2026-10-11 16:28:18 411

原创 C语言结构体完结篇:共用体与枚举

结构体的所有成员各自占用独立的内存。共用体的所有成员共用同一块内存,同一时刻只能保存其中一个成员的值。int i;float f;上面的Data中,ifstr三个成员并不是先后排列,而是重叠存放。枚举是一种把一组相关的整型常量集中定义的方式,让代码用有意义的名字代替“魔法数字”。默认情况下,RED = 0GREEN = 1BLUE = 2,依次递增。OK = 200,LOW = 1,HIGH = 5,到这里,C 语言系列的收官内容就讲完了。共用体。

2026-10-10 11:22:15 357

原创 C语言结构体:从入门到进阶的完整指南

在 C 语言中,结构体(struct)是一种用户自定义的复合数据类型,它可以把多个不同类型的数据组合在一起,形成一个新的数据类型。例如,一个学生有学号、姓名、成绩等信息,这些信息虽然类型不同,但都属于同一个学生对象,使用结构体可以方便地统一管理。把一组相关的变量组织到一个名字下,使代码更清晰、更易维护。结构体的定义使用关键字structstruct 结构体名 {数据类型 成员1;数据类型 成员2;int y;定义结构体时,末尾的分号不能省略。int x;

2026-10-09 09:32:29 560

原创 C 语言指针最终篇章:指针数组、函数指针与二级指针

学 C 语言的路上,指针是最陡的一段坡。从最初的int *p指针数组、函数指针、二级指针。指针数组:数组里装的不是普通变量,而是一个个指针;函数指针:指针指向的不是数据,而是函数;二级指针:指针本身也有地址,于是出现了「指向指针的指针」。学完这一篇,你的指针知识体系才算真正闭环。下面我们逐个击破,再用一张图把三者串起来。至此,指针的最终篇章落下帷幕。指针数组:数组里装指针,最典型的是字符串数组,要能区分它与数组指针。函数指针:指针指向函数,让函数可以像数据一样传递,常用于回调函数与函数指针数组。

2026-10-08 21:00:44 691

原创 C语言指针超级进阶:字符与字符串数组、string 库函数原型、指针与二维数组

字符指针char *指向字符串首地址,指向的字符串常量不可修改。字符串数组:二维字符数组内容可改、定长;指针数组灵活省内存。string 库函数:牢记strlenstrcpystrcatstrcmpstrchrstrstr等原型,体会指针移动的共性,并注意缓冲区安全。指针与二维数组a[i][j]等价于;分清数组指针与指针数组int *p[n]。抓住「指针即地址、指针加减按其所指类型为单位移动」这一本质,再结合上述原型与数组结构反复练习,就能稳步跨过指针进阶这道坎。

2026-10-07 21:03:04 807

原创 C语言指针终极学习指南:从入门到精通

指针是一个变量,它存储的是另一个变量的内存地址。指针本身也有地址,也可以被其他指针指向。int a = 10;// p 存储 a 的地址// pp 存储 p 的地址地址:指针存储的是内存地址类型:指针类型决定了步长和解引用方式生命周期:动态内存需要手动管理建议通过大量编码练习来巩固,特别是链表、二叉树等数据结构的实现,是检验指针掌握程度的绝佳方式。指针不是洪水猛兽,而是 C 语言赋予你的强大工具。

2026-09-29 20:25:47 691

原创 C 语言宏与编译全过程详解:从预处理到可执行文件

宏由#define定义,本质上是一个文本替换规则。预处理器在展开宏时,不会做类型检查,也不会进行函数调用,只是机械地替换。这条命令会输出所有预定义宏和自定义宏,适合排查“宏到底有没有生效”的问题。本文梳理了 C 语言从源码到可执行文件的完整流程,并深入讲解了宏的工作原理、进阶技巧和常见陷阱。C 语言编译分为预处理、编译、汇编、链接四个阶段。宏是在预处理阶段进行的纯文本替换,不参与真正的编译与类型检查。函数宏必须注意括号、副作用和作用域三大陷阱。用于字符串化,##用于拼接标记,用于可变参数。

2026-09-28 21:04:38 611

原创 C 语言入门:函数、函数调用与递归

返回类型 函数名(参数列表) {函数体return 返回值;int:返回类型,表示函数最终返回一个整数。add:函数名,调用时使用。:形参列表,接收调用方传入的值。:把计算结果返回给调用方。如果函数不需要返回值,可以使用void类型;如果不需要参数,参数列表写void\n");递归就是函数直接或间接地调用自己。基线条件(base case):让递归停下来的终止条件。递归条件(recursive case):把问题拆成更小的同类问题,继续调用自身。

2026-09-23 21:18:56 225

原创 C 语言入门:字符数组与字符串处理全解析

字符串在 C 语言中是以'\\0'结尾的字符数组。puts输出字符串,gets输入字符串(有安全隐患,推荐用fgetsstrlen统计长度(不含'\\0'),strcpy拷贝,strcat拼接,strcmp比较。二维字符数组适合存储一组字符串,每行代表一个字符串。使用所有字符串函数前,务必保证目标空间足够,避免越界访问。掌握这些基础后,你就可以处理 C 语言中绝大多数文本场景了。建议动手把每个示例都跑一遍,并尝试修改数组容量、观察越界风险,加深理解。

2026-09-22 21:04:20 713

原创 C 语言入门:选择、冒泡、插入排序及字符与字符串数组详解

选择排序每轮“选。

2026-09-21 21:11:38 569

原创 Linux 环境下 C 语言学习第七天:数组与选择排序实战

一周的 C 语言学习过去了,循环、分支这些基础语法已经打下了底子。今天开始上强度:补齐循环的细节,正式进入数组的学习,一路写到选择排序。数组是 C 语言里非常核心的数据结构,也是后续指针、字符串、动态内存等内容的基石,这一篇把数组讲透,再用选择排序收尾。数组是同类型元素的有序集合,在内存中连续存放。类型 数组名[元素个数];// 下标从 0 开始printf("第一个元素: %d\n", scores[0]);printf("第三个元素: %d\n", scores[2]);return 0;

2026-09-20 21:02:47 147

原创 C语言三大控制结构详解

结构类型适用场景示例顺序结构按顺序执行代码直接写代码即可分支结构根据条件选择执行路径ifelse ifelseswitch循环结构重复执行某段代码forwhiledo-while通过掌握这三种结构,可以编写出功能更强大的 C 程序。在 Linux 环境下,结合命令行工具(如Ctrl+C中断程序、ps查看进程、kill终止进程),可以更好地调试和管理程序运行。

2026-09-20 00:23:54 85

原创 嵌入式 Linux 新手 C 语言第四天:函数调用与输入输出

在 C 语言里,函数是一段可以被重复使用的代码块。调用函数,就是让程序暂时跳到这段代码里执行,执行完毕后再回到原来的位置继续向下走。return 0;这里printf是函数名;括号里的是参数;末尾的分号表示这是一条完整的语句。函数名(实际参数列表);第二行把字符常量'A'传给putchar,第三行把int类型的变量number传给它。参数既可以是字面量,也可以是变量。

2026-09-17 20:49:47 238

原创 嵌入式Linux学习第三天:运算符、表达式与随机数

表达式是由运算符和操作数组成的式子。a + bx * 2 + 1a > b每个表达式都有一个值,这个值就是表达式的结果。当表达式中出现不同类型的操作数时,编译器会自动进行类型转换,这个过程叫隐式类型转换(也叫自动类型转换)。运算符与表达式:算术、关系、逻辑、赋值、位运算,重点是位运算在嵌入式中的应用转义符:掌握\n\t\\\"等常用转义符,注意嵌入式串口输出中\r\n的用法隐式类型转换:记住"向精度高的方向转换",警惕整数除法和有符号/无符号混用的陷阱产生随机数srand()设置种子 +

2026-09-16 20:25:10 130

原创 嵌入式练习生第二天:进制转换与 C 语言数据类型

数据类型 变量名 [= 初始值];// 定义整型变量并初始化// 字符变量// 浮点型变量// 双精度浮点型// 无符号整型,未初始化嵌入式编程中,建议所有变量都显式初始化。因为未初始化的变量里存的可能是“垃圾值”,读到它会让程序出现莫名其妙的问题。

2026-09-15 20:53:03 322

原创 嵌入式 Linux 练习生第一天

嵌入式 Linux 的难点不在某一条命令,而在于环节太多、反馈周期长。写代码 → 编译 → 运行。这个闭环跑通以后,再去学文件操作、进程、网络编程,以及交叉编译和开发板实操,都会有一个稳固的起点。

2026-09-14 20:26:14 178

空空如也

空空如也

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

TA关注的人

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