自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 IO多路复用(select/poll/epoll)

本文介绍了在高并发场景下,select服务器通过IO多路复用技术提升性能的原理与实现。传统创建进程/线程处理多连接开销大,而select通过内核监控多个文件描述符(fd),仅在事件就绪时唤醒程序,显著降低资源消耗。关键在于将fd设为非阻塞模式,避免因竞争或数据被抢读导致阻塞。文中以select实现回显服务器为例,展示其核心流程:创建socket、绑定、监听,再使用select监控监听和已连接fd。随后对比了poll、epoll等机制,指出select存在fd数量限制、遍历效率低等问题。最终引入epoll,通

2026-09-22 20:22:24 167

原创 网络通信-网络编程

本文系统介绍了OSI七层模型及简化四层/五层模型,重点阐述套接字(Socket)编程核心概念与流程。涵盖socket创建、绑定地址、监听、连接、收发数据及关闭等操作,对比TCP(面向连接、可靠)与UDP(无连接、高效)通信机制,强调网络字节序处理与典型应用流程,为网络编程提供理论基础与实践指导。

2026-09-16 21:45:50 209

原创 进程间通信

进程空间相互独立,使得进程不需要面对丢失更新问题,与此同时也带来了新的问题,进程之间怎么进行通信?学过文件io之后,我们可以让两个进程对一个txt文件进行读写来进行通信,但是这样有需要反复比对文件内容的需求,如果读写操作频繁一些,又会遇到之前的丢失更新问题所以有了管道文件这种通信方式,管道就像是一个单向的txt文件,一边写,一边读,并且采用队列这种数据结构,读数据就会删除管道中对应的数据。管道分为无名管道和有名管道,无名管道只有有亲缘关系的进程之间可以使用。

2026-09-03 22:41:46 191

原创 线程 --- 共享内存空间

当两个线程的执行流在执行这三步时发生了交叉重叠(A刚读完还没写,B就插进来读并写完了),后写入的值就会无情地覆盖前一个线程的写入结果,导致一次操作被“吞掉”。直到持有锁的线程“解锁(Unlock)”后,等待的线程才能被唤醒,继而安全地执行“读-改-写”操作。线程A和线程B几乎同时读取到了这个值(都读到了10),紧接着,它们都基于这个值进行写操作(比如都执行 count++)。@ const pthread_attr_t *attr(属性):线程的“出厂设置”(栈大小、调度策略、是否分离)。

2026-09-01 21:28:19 191

原创 进程 ---(多任务并行)

全为0说明进程是正常退出(exit(),return,_exit()),返回值为真时说明低七位不是0,可以通WIFSIGNALED(wstatus)获得其终止信号编号。wait是阻塞操作,会等待任意子进程结束后接收返回值,其通过int *status得到的值并非一个单纯的整型返回值,它被分割为了三部分,0~6位是终止信号编号7位是是否产生Core Dump,8~15位才是exit的返回值。fork后会产生一个新的进程,父进程返回值是子进程的pid,子进程的返回值是0(一次调用,两次返回)。

2026-08-24 23:09:56 242

原创 文件编程--文件IO

说明:参数 pathname 指向欲打开的文件路径字符串。O_EXCL 如果 O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若 O_CREAT 与 O_EXCL 同时设置,并且欲打开的文件为符号连接,则会打开文件失败。O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。

2026-08-19 22:27:43 228

原创 文件编程--标准IO

ggglinux中一切皆文件,对文件的操作步骤分为三步1.打开2.读写3.关闭标准IO库 ---- stdio中有对应的函数1.打开fopen2.读写一切皆文件的思想简化linux对文件的处理,可以使用统一的操作逻辑。

2026-08-18 22:45:12 227

原创 内存检测工具--Valgrind

编译时必须带 -g-g 代表 Debug(调试)。它告诉编译器在编译汇编代码的同时,把源代码的额外信息(如变量名、函数名、数据类型和代码行号)以特定格式(如 DWARF 格式)写入到最终的可执行文件中。常用编译格式:gcc -g -O0 -fno-omit-frame-pointer -Wall -Wextra -o app main.c foo.c-g //添加调试信息-O0 //优化级别 不优化-Wall -Wextra:先用编译器把明显问题扫一遍(能省大量时间)

2026-08-17 22:25:26 224

原创 哈希表--数据结构

此前学习了链表与数组两种存储数据的结构,但是二者都有其缺点,数组因为其存储空间连续的特性可以直接访问到其中任意元素,但是此特性也导致其存储空间不能随意的增加或减少(连续空间有可能被其他程序调用)。而链表因其不依赖连续空间的关系可以随意增删,但是想要直接访问其中的元素并不容易,需要借助头节点依次访问。于是这里将两种数据结构组合,用来制作哈希表(链地址法)哈希表的基础思想在于存储位置与其实际值的关系,一般是通过一个函数(hash函数)得到其存储位置(数组下标)比较常用的是除留余数法,这里以此为例写代码。

2026-08-17 21:11:01 174

原创 数据结构--树

树结构,类似于“文件夹系统”或公司的“组织架构图”它是一对多的非线性结构:整棵树最顶层的唯一节点(没有父节点):A 是 B 的直接上级,A 就是父,B 就是子。:没有子节点的末端节点(就像公司里没有下级的一线员工)。:一个节点拥有的子树个数(比如一个领导直接管几个部门)。:从根到该节点经过的边数(层级深度)。

2026-08-13 22:46:50 234

原创 数据结构---队列

头文件。

2026-08-12 21:50:04 220

原创 Linux自动编译 -- makefile

此行的意思是为了生成calc文件,依赖于main.o add.o sub.o mul.o div.o 这四个文件,这四个文件也是下一行命令的引用基础。到这里我们可以发现一个问题,在编写此文件时,我们经常要重复写很多一样的文件名,这里可以依靠定义变量来解决此问题。由.o并不存在(写出的一般为.c文件),需要先编译出来,所以需要有这一段编译的代码作为前两行编译的基础。这里类似于终端上的命令,不过这里需要的文件必须存在于依赖文件。这里是为了删除上次编译产生的文件,保证编译后的文件是最新的。

2026-08-11 21:07:20 151

原创 链表 -- 双向链表

与单向链表的区别在于结构体多了一个指向前节点的指针。

2026-08-11 09:00:59 58

原创 链表 -- 环链表

与普通链表区分,这里头节点指向自己。

2026-08-10 20:42:46 77

原创 数据结构--链表

typedef struct Node { //typedef--给这个结构体(数据类型)起别名int data;//数据域//指针域--重要!指向像它自己一样的结构体}node_t;#include <stdlib.h> /* malloc, free所需头文件 *//* 链表节点结构体data:数据域,存储整型数据next:指针域,指向下一个同类型节点 */}node_t;/* 创建一个新节点返回值:指向新节点的指针,分配失败返回 NULL */

2026-08-10 20:15:40 169

原创 gdb---内存调试

实用操作流程要想进行gdb调试,首先要在编译阶段添加-g然后对运行文件加上前缀gdb,进入gdb调试页面输入run,运行,会自动显示哪行出现了问题,帮助我们debug接下来要学习的数据结构涉及到大量的内存空间管理和指针,编写程序时很容易发生内存上的错误,这时候常用的调试工具就是gdb(gun debugger)

2026-08-07 21:55:22 236

原创 C语言小结---2048游戏实现

从左边p[0]开始向右寻找与p[0]相同数字,0值跳过,遇到非0且不等的数说明此数无法合并,直接退出后看p[1]依次查看下去。

2026-08-05 21:21:51 208

原创 位运算---枚举数据类型

右移 >> 无符号数始终补0,正数补0,负数补1(gcc编译器)默认从0开始,上例CMD_RED就代表0,也可以自己赋值,后面会依次顺延。取反 ~ 1->0 0->1。对比宏定义(define)枚举类型是有类型的,宏定义是文本替换。相对来说枚举类型更安全,让编译器在编译阶段就帮助码者发现错误。或 | 有1则1,全0为0。与 & 全1则1,否则为0。枚举类型在程序编译后有效。

2026-08-05 20:03:48 186

原创 共用体---C语言

共用体特点是在一块内存区域存储不同数据类型的数据,同一时刻只能正确存储一个成员的值。如果直接对d赋值,一般会赋值给第一种数据类型 //此处为int。与强制类型转换类似,共用体也可以只读取低位存储来获得设备是大端还是小端。

2026-08-04 22:09:30 186

原创 结构体---C语言

在C语言中,结构体(struct) 是一种用户自定义的数据类型,它允许你将多个不同类型的数据组合在一起,形成一个整体。结构体里面也可以放结构体(结构体就像是自己创建的一种数据类型)先创建小的结构体,然后可以直接放入大的结构体中。某些情况下,需要用多个变量描述同一个个体,如果不用结构体,你需要定义多个独立的变量,管理起来非常零散。

2026-08-04 20:57:27 191

原创 内存管理---malloc函数

Tips:不要返回在作为局部变量创建的数组(指针),因为函数结束后这片空间就被自动释放了,会被系统或其他函数更改其中的值。malloc(memory allocate)定义在 <stdlib.h> 中,用于在堆(Heap)上动态分配内存。malloc的返回值就是void*,可以赋值给任意的指针,不过强制类型转换可以使代码更易读。(如果是malloc上的值未经释放,其他函数是无法修改上面的值的)注意使用了malloc就必须手动释放内存,避免程序因内存泄漏崩溃。

2026-08-03 11:08:28 210

原创 函数指针-----指向函数的指针

到这里的任务其实函数名本身也可以胜任,但是指针可以更改其地址指向其他函数(同类型函数)使得指针能够根据需要引用不同函数。例如一个函数中要根据输入的参数对两数进行加减乘除,此时可以定义一个函数指针,然后根据参数赋值给指针不同的地址。而在实际应用中,使用函数指针调用函数可以降低代码的耦合性,在增加业务或修改功能时可以避免需要重写底层驱动。这里初始化了一个指针函数(函数名==指向函数的地址)返回类型 (*指针变量名)(参数类型列表);​​​​​​先定义一个函数。

2026-08-03 09:41:41 229

原创 指针数组-----由指针组成的数组

这个数组由指针构成,s(数组名)退化为首元素(s[0])的指针,作为指针的指针,数据类型是char**,指向的字符串仍有不可修改的特性,因此可以在初始化时加上前缀const提升安全性。s1的数据类型是char*,s1是一个地址,指向“hello1”字符串,该字符串存于字符串常量区(只读,不可修改),s1可以改地址来指向其他值。需要重点注意的是s[0]s[1]s[2]本质是指针,是一个地址。此前为了存储字符串,一般使用一维字符型数组。

2026-07-31 21:24:55 180

原创 数组指针---指向数组的指针

int *p=a //这里啊退化为首元素的地址a《=》&a[0],所以int*p=&a[0]和前面等价p本身存储的是a[0]的地址,对其进行*运算可以得到a[0]printf(“%d”,*p)在屏幕上打印数字1由于数组在内存空间上连续,数据类型一致所以*(p+i)可以访问到a[i]元素。

2026-07-30 20:31:31 202

原创 C语言----指针

基类型 * 指针变量名;示例:int * p这里的基类型是指被指向的数据类型是什么类型,在64位下,指针类型所占据的空间都是八个字节(一个字节八位二进制数)这里的*是指定义了指针类型变量的提示符,与之后*运算不同。int a = 10;//意识是p的值是a的地址int a = 10;int *p;*p = &a;//这是不可行的,*p是指p地址上的值p=&a;//这是可行的,p本身就是需要一个地址为值int *p;//定义指针却不初始化,指针值是随机的。

2026-07-29 21:27:31 175

原创 C语言————存储类别关键字

在{}也就是花括号内就是局部作用域,在局部作用域内定义的也就是局部变量。

2026-07-28 21:17:07 196

原创 递归函数---汉诺塔问题

此时发现,将n-1个盘子挪到柱子2本质上与将n个盘子挪到柱子3类似,由此递归成立,而且可以推测出递归到最后的问题是将一个盘子挪到某个柱子上。最终目的是将三个圆盘全部挪到第三根柱子(第二根也行,此时这两根空柱子是等价的)三号盘到达柱子3后的目标是把在柱子2的一号盘和二号盘挪到柱子3。由于大圆盘必须在下面,可以得到的首要目标是把三号盘放到柱子3。经过这个过程,可以把n个盘子从柱子1挪到柱子3的步骤拆为三步。易得三号盘放到柱子3的前提是一号盘与二号盘在柱子2。(3)将n-1个盘挪到柱子3。

2026-07-28 20:21:35 169

原创 C语言---函数

这里封装了一个my_index()函数,可以输入底数a与指数b就可以得到a^b,注意返回值在return后。这里将判断是否为素数封装成了一个函数,使得下面寻找差值为2的素数时编程变得简单且清晰。函数的本质是一段代码块,将代码块封装成函数以避免重复工作并且使得代码更清晰。void在类型标识符或形参位置时,代表没有返回值或不需要参数。需要注意的是,c程序至少要有一个main函数。类型标识符 函数名(形式参数)return 返回值;

2026-07-24 21:49:08 235

原创 C语言---二维数组

C语言的二维数组的定义语法:类型说明符 数组名 [常量表达式][常量表达式];可以视作有行列(下标)的集合(方便理解)例:上面的初始化数组相当于创建了下面这个集合,一般第一个常量表达式视作行下标例如printf(“%d”)0 1 2 3 ---列下标行下标二维数组的遍历一般需要两个循环函数用途:存储数值数据,用于数学运算(矩阵乘法、图像处理、统计计算等)。

2026-07-24 21:34:22 178

原创 字符型数组

定义例: char a[10];char是数据类型,a是数组名,10是数组长度字符型数组特别有:需要注意:char s[10];s="hello";上例是不被允许的字符串数据,我们更关心的是整个字符串,而不是字符串中单个字符字符串结束标识是‘/0’

2026-07-23 21:37:30 229

原创 二分查找法(c语言)

时间复杂度:O(log n),随着数据增加,查找需要的增长的并不快,是非常高效的查找算法。核心思想:每次通过比较中间元素,将搜索范围缩小一半,直到找到目标或范围为空。重要前提:被查找数组是有序的。

2026-07-23 21:06:51 218

原创 C语言--排序算法

选择排序核心思想:每一轮从待排序的元素中选出最小的一个,放到已排序序列的末尾。易错点:内层循环需要从i+1开始,若从i开始则a[i]会与a[i]自己比较一次。外循环i需要从0开始,因为数组从a[0]开始。

2026-07-22 09:10:31 171

原创 C语言-数组

类型说明符 数组名 [常量表达式];说明:(1) 类型说明符 --- 用来说明 数组中变量的类型intfloatchar(2) 数组名 --- 代表一组变量的集合标识符起名字的规则和变量名命名规则一致(3)[常量表达式] --- [] //表示定义的是一个数组常量表达式 //数组的长度 ---- 数组中变量的个数注意:常量表达式是整型的c99标准之后,不要求必须是常量,也可以是变量 (可变长数组)int n。

2026-07-21 21:42:18 154

原创 C语言流程控制

就是做大小判断运算符有:>=<=== //相当于等于号!= //不等于号关系运算表达式返回值为真(1) 假(0)用整型(int)来处理与存储&& 与运算规则:一假则假|| 或运算规则:一真则真!非运算规则:真假相对。

2026-07-20 21:51:52 178

原创 c语言输入输出函数

在格式符中间可以添加一个整数,例如%5d,表示指定数据数据的宽度,当实际宽度较小时默认右对齐,左边补空格,可以在整数前加 - 表示左对齐,当实际宽度较大时以实际宽度输出。格式输入输出用格式符(例如%c、%d)精确规定数据的类型和外观,让一条语句能灵活处理各种混合数据,而不是只能处理单一数据类型。在格式符中间可以添加一个.N,例如%.2f,表示保留n位小数 //在%f与%e中的情况。在试图输出%时,%会被程序误认为格式符的一部分,所以规定有%%输出一个%

2026-07-20 20:31:03 176

原创 计算机算数运算基础

/a=0xffff8765 b的符号位为1。//a=0x00001234 b的符号位为0。a -= 1 //相当于a = a-1以此类推*= /= %=/ //除法在运算数的数据类型均为整型时,相当于整除,不会出现小数。//此式结束后,a=1。a += 1 //相当于a = a+1。//高位截断 也就是低位保留,b=0x5678。

2026-07-18 20:04:18 206

原创 数据类型基础学习

反码=1111 1111 1111 1111 1111 1111 1110 0010 //注意取反码时符号位不变。补码=1111 1111 1111 1111 1111 1111 1110 0011 //计算机中真正存储的值。1111 1111 1111 1111 1111 1111 1110 0011 //上例负数的补码。1|111 1111 1111 1111 //对此补码求补码,得到值为-1。

2026-07-18 19:10:01 222

原创 Linux基础学习

-----------------------------------表示普通用户的命令提示符,如果是 root 管理员,这里会显示为。//如果在同一目录下命令则起到了改名字的作用。ubuntu ---------------------------主机名(通常是 Ubuntu 系统的默认主机名)~ ----------------------------------家目录(此位置表示当前所在目录)linux ------------------------------我的用户名(默认用户名)

2026-07-16 20:21:13 254

空空如也

空空如也

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

TA关注的人

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