- 博客(38)
- 收藏
- 关注
原创 HTML 基础 + SQLite3 数据交互
嵌入式 Web 开发的核心是 “轻量、实用”:HTML 层面掌握表单、超链接、图片即可满足大部分场景,无需过度追求样式;数据交互层面,SQLite3 凭借轻量、无需安装的特性,是嵌入式 Web 服务的最佳数据库选择。结合本文的 HTML 基础和 SQLite3 交互示例,可快速实现嵌入式设备的 Web 登录、参数配置、状态展示等核心功能,适配智能家居、工业控制、物联网网关等各类嵌入式场景。
2025-12-30 22:21:37
631
原创 SQLite3 数据库
SQLite3 以轻量、易用、跨平台的特性,成为嵌入式开发中数据管理的最优解。掌握其基础指令、SQL 语句及 C 语言编程接口,可快速实现嵌入式设备的海量数据存储与管理。无论是智能家居、工业控制还是物联网设备,SQLite3 都能以极小的资源开销,满足数据增删改查的核心需求。
2025-12-29 21:28:18
649
原创 理解 Linux IO 多路复用
IO 多路复用是 Linux 高并发网络编程的基石,select 作为经典实现,兼容度高但性能受限;epoll 则凭借事件驱动、零拷贝、无 fd 数量限制等优势,成为高性能服务器的首选方案。在实际开发中,需根据业务场景选择合适的 IO 模型:低并发场景可使用 select 快速实现,高并发场景则优先使用 epoll,充分发挥服务器的性能潜力。
2025-12-28 13:46:35
886
原创 进程间通信(IPC):管道通信全解析
无名管道(也叫匿名管道)是仅支持有亲缘关系进程(父子 / 兄弟进程)通信的半双工管道,无文件名称,文件系统不可见,生命周期随进程结束而销毁。有名管道(FIFO)解决了无名管道 “仅亲缘进程通信” 的限制,支持任意单机进程通信,底层队列结构与无名管道一致,最大区别是 “文件系统可见”(有明确的路径和名称)。
2025-12-27 12:40:38
832
原创 TCP 协议:从核心特性到套接字编程实战
TCP 是面向连接、可靠的传输层协议,核心优势是数据无丢失、有序交付,适合对可靠性要求高的场景(文件传输、登录认证、金融交易);CS/BS/P2P 是 TCP 的核心应用模型,其中 CS 灵活性高、BS 轻量化、P2P 去中心化;TCP 编程的核心是区分「监听套接字」和「通信套接字」,掌握三次握手 / 四次挥手的底层逻辑,同时注意处理黏包、连接断开等问题;
2025-12-24 18:33:21
738
原创 OSI 模型到 UDP 套接字
网络编程的核心是理解分层模型:OSI 是理论,TCP/IP 是实际应用,重点掌握应用层 / 传输层 / 网络层的核心协议;UDP 适合低延迟、实时性要求高的场景,核心是「无连接、数据报有边界、收发次数对应」;套接字编程的关键:正确转换字节序、绑定地址(服务端)、用实际字节数收发数据(尤其二进制文件)。
2025-12-23 18:49:49
921
1
原创 【Linux 进程间通信】信号通信与共享内存核心解析
c运行// 函数原型(简化版)功能:注册信号处理函数,自定义信号的处理行为;参数signum:要捕获的信号编号;handler:信号处理方式,支持 3 种:SIG_DFL:使用系统默认处理行为;SIG_IGN:忽略该信号;自定义函数:如,接收信号编号作为参数;返回值:成功返回原信号处理函数地址,失败返回SIG_ERR。示例:自定义 SIGCONT 信号的处理函数c运行printf("捕获到信号%d,进程被唤醒\n", num);// 注册信号处理函数信号通信。
2025-12-19 18:48:55
712
原创 Linux 线程控制核心:互斥锁与信号量(同步)
有先后顺序的排他性访问」—— 不仅要保证同一时刻一个资源被一个线程访问,还要强制线程按照指定顺序执行(如线程 A 执行完后,线程 B 才能执行)。因锁资源的申请 / 释放逻辑错误,导致线程 / 进程永久阻塞,无法继续执行的现象。互斥锁:解决「单一资源的排他访问」,临界区必须短小,加解锁同线程;信号量:解决「多资源竞争 / 线程同步」,支持交叉释放,临界区可适度耗时;死锁规避:打破四个必要条件中的任意一个(如统一锁申请顺序)即可;选型原则:单一资源排他访问 → 互斥锁;
2025-12-17 17:48:41
652
原创 Linux 线程(POSIX)核心教程
Linux 中,线程被称为 “轻量级进程(LWP,Light Weight Process)”,—— 一个进程可以包含多个线程,所有线程共享进程的资源(如内存空间、文件描述符、信号处理等),同时拥有独立的执行流。
2025-12-16 18:17:57
878
原创 Linux 进程控制核心:exec 族函数、waitpid 与 system 全解析
exec 族:程序替换核心,fork+exec 是 Linux 进程编程的经典组合,exec 成功则进程被替换,失败才返回;waitpid:子进程资源回收的唯一方式,阻塞 / 非阻塞模式适配不同场景,避免僵尸进程;system:便捷但受限,无法修改父进程状态,底层是 fork+exec+waitpid;路径控制:getcwd 获取当前路径,chdir 修改路径(仅影响当前进程);核心原则。
2025-12-16 09:00:39
966
原创 【Linux 进程核心】父子进程关系、终止与资源回收
父进程创建子进程后,子进程先终止子进程的用户空间内存被释放,不再参与 CPU 调度;内核中的 PCB(进程控制块)未释放(保留退出状态、PID 等信息);子进程状态变为 Z(Zombie),成为 “僵尸进程”。父进程创建子进程后,父进程先终止子进程失去父进程,会被内核指定的 “新父进程” 接管(通常是 init 进程 / PID=1,或 systemd/PID=1);子进程正常运行,终止后由新父进程回收资源。父子进程内存。
2025-12-13 14:07:16
539
原创 【Linux 系统编程核心】进程的本质、管理与核心操作
进程是程序的动态执行过程,由 PCB 管理,占用系统资源,支持并发;虚拟内存为进程提供隔离性和安全性,上下文切换是实现并发的核心机制;Linux 通过 CFS 等调度算法分配 CPU 时间片,实现 “宏观并行、微观串行”;fork()是创建进程的核心函数,父子进程独立运行,返回值是区分二者的关键;pstopkill是进程管理的常用命令,getpid()getppid()是获取进程 ID 的核心函数。
2025-12-11 18:49:42
659
1
原创 【Linux 系统编程】文件 IO 与 Makefile 核心实战:从系统调用到工程编译
类型本质核心特征适用场景文件 IO操作系统对外提供的系统调用函数无缓冲区、文件描述符(int)、功能强大设备文件(如/dev下设备)、实时性要求高的场景标准 IOC 标准库封装的文件操作函数带缓冲区、文件流指针(FILE*)、跨平台普通文件(文本 / 二进制)、通用文件操作通过自定义变量适配不同工程,可灵活修改源文件、目标名、编译选项:makefile# 自定义变量:源文件、目标名、编译选项SRC += func.c # 追加源文件FLAG = -g # 编译调试信息。
2025-12-11 18:49:09
591
原创 Linux 系统编程之标准 IO 文件操作全解析
argc:命令行参数的总个数(包含程序名本身)argv:字符串数组,存储每个参数的内容(argv[0] 是程序名,argv[1] 及以后是用户传递的参数)#include >// 定义结构体(二进制数据示例)int age;} Student;int main()// 1. 写入结构体数据// wb:二进制只写\n");return -1;// 写入 1 个 Student 大小的数据fclose(fp);// 2. 读取结构体数据// rb:二进制只读\n")
2025-12-10 14:32:19
920
原创 【Linux 系统编程】文件操作核心知识点:标准 IO 与文件基础
先通过fopen打开文件并指定操作模式,再根据场景选择字符级(fputc/fgetc)、行级(fputs/fgets)或块级(fread/fwrite)读写,最后通过fclose释放资源;理解 Linux 文件类型和 man 手册的用法,是解决文件操作问题的关键;命令行参数则是扩展文件操作程序灵活性的基础(如指定待操作的文件路径)。掌握这些知识点,即可覆盖绝大多数文本 / 二进制文件的读写场景,也是后续学习高级文件操作(如系统调用)的基础。
2025-12-08 18:18:04
772
原创 【数据结构核心篇】树与哈希(Hash)的原理、特性及实战应用
存储位置 =f(key)f:哈希函数(散列函数),负责将 key 转换为数组下标;key:待存储 / 查询的数据;存储位置:数组中存储该数据的地址(下标)。核心载体:通常基于顺序表(数组)实现(需支持随机访问)。但:不同数据通过哈希函数计算出相同的存储位置。c运行// 哈希表结构(数组实现)// 哈希表数组指针int tlen;// 哈希表总长度} HS_TABLE;// 核心操作函数// 创建哈希表// 插入数据// 查询数据// 销毁哈希表树。
2025-12-06 11:59:12
922
原创 【数据结构详解】栈与队列的核心原理、实现及应用场景
定义:队列是只允许在一端(队尾)插入、另一端(队头)删除的线性表。核心特性:先进先出(FIFO)。关键术语队头(Head):允许删除的一端;队尾(Tail):允许插入的一端;入队(EnQueue):向队尾添加元素;出队(DeQueue):从队头移除元素。核心应用:解决 “速度不匹配” 问题(如缓冲区、消息队列、任务调度)。c运行// 自定义数据类型// 队列数组指针int tlen;// 队列总容量int head;// 队头指针int tail;// 队尾指针。
2025-12-05 12:20:43
747
原创 双向链表的完整实现与应用详解
c运行// 业务数据类型(以学生信息为例)// 姓名char sex;// 性别int age;// 年龄int score;// 分数} DATATYPE;// 双向链表节点结构// 节点存储的业务数据// 前驱节点指针// 后继节点指针// 双向链表管理结构(带头节点)// 头节点指针(不存储业务数据)int clen;// 链表有效节点数// 遍历方向枚举SHOW_FORWARD, // 正向遍历(头→尾)SHOW_BACKWARD // 反向遍历(尾→头)
2025-12-05 12:16:58
368
原创 嵌入式开发必备:GDB 调试从入门到精通
断点策略:在关键函数入口、循环开始处、可疑代码前设置断点单步调试:用s进入自定义函数,n快速跳过库函数数据监控:善用display跟踪关键变量变化调用栈分析:遇到崩溃先用where定位问题位置条件断点:可结合b 行号 if 条件设置条件断点(进阶技巧)
2025-12-02 18:26:17
209
原创 单向链表:线性表的链式存储实现与应用
链表的基本单元是节点(Node)数据域:存储数据元素本身;指针域:存储下一个节点的地址,维系链表的逻辑关系。c运行// 通用数据类型定义char sex;int age;int score;} DATATYPE;// 链表节点结构// 数据域// 指针域(指向下一个节点)} LinkNode;为了方便管理链表,通常封装一个链表头结构,包含链表的核心信息:c运行// 指向链表头节点int clen;// 当前节点个数} LinkList;
2025-12-01 18:13:00
294
原创 数据结构基础:从概念到线性表的实现
线性表是零个或多个数据元素的有限序列,数据元素间呈一对一关系。由于数据量通常较大,线性表的内存一般分配在堆空间(生命周期由程序员控制,需手动 malloc/free)。顺序表是线性表的顺序存储实现,结构如下:c运行// 指向堆空间的数组首地址int tlen;// 总容量int clen;// 当前元素个数} SeqList;
2025-11-28 17:46:54
272
原创 C 语言进阶:共用体、枚举与位运算
c运行union 类型名 {数据类型 成员变量1;数据类型 成员变量2;数据类型 成员变量3;// ...// 示例int a;// 假设占4字节char c;// 假设占1字节float f;// 假设占4字节核心特征:内存共享:共用体的所有成员变量共享同一块内存。修改一个成员,会影响到其他成员的值(因为它们指向同一个内存地址)。大小取决于最大成员:共用体所占的内存大小等于其最大成员变量的大小。在上面的例子中,union DATA的大小是或,通常为 4 字节。c运行。
2025-11-25 17:32:40
316
原创 详解 C 语言 void * 万能指针与结构体核心用法
结构体用于封装多个不同类型的变量,形成自定义复合类型,定义格式:c运行struct 结构体名 {数据类型 成员变量1;数据类型 成员变量2;// 更多成员变量void*是通用指针,核心解决不同类型指针的统一处理,转换时需遵循 “任意→void* 直接转,void*→任意 强制转” 的规则,解引用前必须指定具体类型;结构体是 C 语言封装复合数据的核心方式,初始化支持完全 / 部分赋值,成员访问依赖->运算符,内存布局遵循字节对齐规则;结构体数组传参优先使用地址传递,结合void*
2025-11-24 18:48:47
960
原创 C 语言进阶】彻底搞懂指针数组与数组指针
c运行数据类型 *数组名[数组长度];比如:c运行// 指针数组:包含5个int*类型指针的数组int *a[5];// 指针数组:包含5个char*类型指针的数组(常用于存字符串)char *b[5];c运行数据类型 (*指针名)[数组长度];注意:括号不能省略!否则会被解析成 “指针数组”。比如:c运行// 数组指针:指向包含3个int元素的数组// 数组指针:指向包含100个char元素的数组(常用于二维数组传参)维度指针数组数组指针本质数组(存指针)
2025-11-21 22:19:56
611
原创 C 语言核心进阶:指针函数、函数指针与 const 指针
函数指针的核心是一个指针,只是这个指针不指向普通数据(int、char),而是指向一段函数代码的入口地址。C 语言中,函数名本身就是函数的入口地址(类似数组名是数组首地址),因此函数指针可直接指向函数名。c运行// 返回值类型 (*指针变量名)(参数类型列表)// 定义一个函数指针op,指向“返回int、参数为两个int”的函数是函数指针,是指针函数(优先级问题)。函数指针的 “参数类型列表” 必须与指向的函数完全匹配(返回值类型也需匹配)。函数指针的语法较繁琐,可通过typedef。
2025-11-20 19:06:26
589
原创 C 语言指针与数组深度解析:从函数传参到字符串操作
指针与数组是 C 语言的灵魂,理解它们的工作机制对于编写高效、简洁的代码至关重要。值传递与地址传递的选择取决于是否需要修改实参;数组名作为指针常量的特性简化了数组操作,但也需注意与指针变量的区别;而字符串函数的实现则充分体现了指针在字符处理中的灵活性。
2025-11-19 18:33:18
369
原创 C 语言指针详解:从基础到进阶的核心要点
c运行基类型 *指针名;常见指针定义示例:c运行int *p;// 指向int类型的指针char *p;// 指向char类型的指针float *p;// 指向float类型的指针double *p;// 指向double类型的指针int *p, q;// 注意:p是int*类型,q是int类型。
2025-11-18 18:05:10
404
原创 C 语言核心知识点详解:函数、数组、宏定义与预处理指令
宏定义是预处理指令的一种,通过#define关键字定义,在预处理阶段完成代码替换,无需编译和运行时开销。c运行// #define DEBUG // 取消注释则启用调试模式#ifdef DEBUG // 若DEBUG宏已定义,则编译以下代码printf("调试模式:变量x = %d\n", x);#endif#ifndef DEBUG // 若DEBUG宏未定义,则编译以下代码printf("发布模式:不输出调试信息\n");函数使用。
2025-11-17 19:06:58
937
原创 C 语言核心知识点:变量作用域、生命周期与函数参数传递全解析
变量类型作用域生命周期存储区域默认初始值局部变量代码块 / 函数内从定义到作用域结束栈区随机值(未初始化)全局变量整个工程程序启动到结束数据区0作用域与生命周期的关系:作用域是 “访问范围”,生命周期是 “存在时间”,存储区域是两者的核心决定因素。static 的核心作用:修饰局部变量→延长生命周期;修饰全局变量 / 函数→限制作用域。参数传递原则:需修改实参用 “地址传递”(指针),仅读取用 “值传递”。
2025-11-14 22:44:09
613
原创 C 语言数组与字符串操作全解析:从二维数组到字符串函数
定义格式数据类型 数组名[行数][列数];其中,行数和列数必须是整数常量,数据类型不能为void。定义格式char 数组名[字符串个数][每个字符串的最大长度];二维数组是处理矩阵、平面数据的重要结构,通过行数×列数定义,支持完全初始化、局部初始化和省略行数的初始化方式,遍历需嵌套循环。二维字符数组用于存储多个字符串,每行代表一个字符串,可通过行下标直接访问整个字符串。字符串操作函数(strcatstrcmpstrcpystrlen。
2025-11-13 18:23:43
291
原创 C 语言字符型数组:字符串的存储与核心操作
c运行char 数组名[常量];// 指定大小char 数组名[];// 省略大小,由初始化内容决定。
2025-11-12 18:36:41
449
原创 C 语言数组详解:从定义到初始化再到排序
类型名 数组名[整形常量];类型名:指定数组元素的基类型(如 int、char、float);数组名:遵循标识符命名规则,代表数组的首地址;整形常量:指定数组长度(元素个数),必须≥0,且不能是 void 类型,可直接写常量或合法常量表达式。合法定义示例c运行int a[5];// 定义int型数组a,包含5个元素int b[2+4];// 常量表达式作为长度,等价于int b[6]// 定义float型数组c,包含10个元素注意。
2025-11-11 18:16:03
502
原创 C 语言核心知识点:循环结构与数组
C 语言数组定义语法:c运行类型名 数组名[整型常量];数组元素类型必须一致(如 int 数组只能存整数)。数组长度需是整型常量(可写常量表达式,如 2+4),且大于等于 0。示例:int a [5];定义一个包含 5 个 int 元素的数组,占用连续内存。
2025-11-10 18:22:23
943
原创 C 语言流程控制详解:顺序、分支与循环全解析
顺序结构是 C 语言程序最基本的执行模式,程序从main函数开始,按照代码书写顺序依次执行,直到遇到return 0main函数结束标志)。这种结构无需额外关键字控制,代码自上而下自然执行,是所有复杂逻辑的基础。例如:c运行上述代码会依次完成变量定义、求和、打印操作,无跳转或分支,属于典型的顺序结构。
2025-11-07 18:21:00
926
原创 C 语言输入输出函数详解:从基础到实战
一、单字符输入输出:putchar 与 getchar单字符 I/O 函数专注于单个字符的读写,语法简洁、执行高效,是理解 C 语言 I/O 机制的入门基础。
2025-11-06 18:13:30
988
原创 C语言运算符全解析:从基础到优先级的实战指南
• 逻辑运算符(针对布尔值):&&(逻辑与)、||(逻辑或),短路求值(如a&&b中a为假时b不执行)。• 复合赋值(+= -= *= /= %=等):是“运算+赋值”的简写(如a+=3等价于a=a+3);// 先算b*c=12,d=14(而非(a+b)*c=20)• 位运算符(针对二进制位):&(按位与)、^(按位异或)、|(按位或),均为双目运算符;• 基础赋值(=):左值必须是变量(不能是常量/表达式),右值可以是常量/变量/表达式;=) 自左至右 a>b==c先算a>b。:) 自右至左 a>b?
2025-11-05 18:11:06
352
原创 C 语言基础:数据类型、常量变量与运算符详解
C 语言的数据类型分为基本类型、构造类型、缺省类型和布尔类型,不同类型对应不同的内存占用和使用场景。
2025-11-04 18:25:43
902
原创 Linux新手入门:VMware配置与核心操作全攻略
在配置好关键环境(如安装完软件、配置好服务)后创建快照,后续操作失误时,可一键恢复到快照保存的状态,避免重复配置的麻烦。复制粘贴:终端中复制为Ctrl+Shift+C,粘贴为Ctrl+Shift+V(普通的Ctrl+C/V在终端中有其他功能,不可混用)。:通过VMware的复制粘贴功能,可直接实现Windows与Linux之间的文件传输,无需额外安装传输工具,新手友好度拉满。Tab键补全:输入命令、文件名或目录名时,按Tab键可快速补全,避免输入错误,是Linux新手最值得掌握的技巧之一。
2025-11-03 18:10:21
835
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅