自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 硬中断,软中断恢复位置

•硬件中断:通过 bx lr 指令返回到中断前的位置。恢复位置的区别1. 软中断:•在软中断中,返回地址通常保存在 LR 中,但操作系统会直接修改 PC 来返回到调用点,因此不需要调整 LR。2. 硬件中断:•在硬件中断中,返回地址也被保存在 LR 中,但为了返回到中断发生前的指令位置,通常需要将 LR 减去 4(因为 LR 中保存的是中断发生后的下一条指令地址)。•通过 bx lr 指令返回到中断前的位置,通常需要调整 LR 来确保返回到中断发生时的指令位置。mvn,不是立即数按位取反装。

2024-09-19 21:10:32 265

原创 soc及其相关概念

用户无法直接操作内存,只能让内存映射到用户空间然后操作1. 内存映射(Memory-Mapped Files)内存映射文件是一种方法,它允许一个或多个进程将一个文件或者一个匿名区域映射到它们各自的虚拟地址空间中。当文件被映射到内存后,进程可以直接对内存中的数据进行读写操作,就像操作普通的内存一样。这些修改会反映到文件中,并且在进程之间共享。优点:•高效:数据不需要在用户空间和内核空间之间复制。•简单:使用标准文件接口即可操作内存映射区域。缺点:•如果文件很大,可能会占用大量的内存资源。•需要注意同步问题

2024-09-18 19:05:35 770

原创 树形结构(1)

满二叉树一定是完全二叉树:从右往左,从下至上,依次删除若干个连续的节点,是完全二叉树,增加反之。节点的度:由节点延伸出来的节点数。满二叉树:每层的度都是满的。前序+中序 :确定二叉树。后序+中序 :确定二叉树。叶子节点:没有后继节点。由一个节点引出,根节点。二叉树:广度不能超过二。层序+中序:确定二叉树。分支节点:有后继节点。

2024-09-09 09:18:54 161

原创 栈和队列(1)

操作系统中的 I/O 缓冲区通常位于内存中,以下是几个例子:Linux 中的 I/O 缓冲区Linux 操作系统提供了多种类型的 I/O 缓冲区,包括:•页缓存(Page Cache):•页缓存用于缓存文件系统的读写操作。队列假溢出的原因在循环队列中,如果只使用尾指针(rear)来表示队列的末尾位置,并且头指针(front)来表示队列的起始位置,那么在某些情况下,即使队列中还有空闲空间,也可能因为头指针和尾指针的位置关系导致无法插入新的元素。栈支持两种主要的操作:•压栈(Push):向栈中添加一个元素。

2024-09-06 19:22:50 829

原创 【无标题】

在定义一个结构体时,如果该结构体包含另一个结构体的指针成员,这个指针成员默认是没有分配内存的,因此它并不能直接指向另一个结构体的所有成员。解释当你在一个结构体中定义另一个结构体的指针成员时,这个指针默认初始化为 NULL。当你调用一个函数时,实际上是通过这个指针访问函数的入口地址,并跳转到该地址执行函数体内的代码。结构体嵌套时,在结构体内部定义另一个结构体指针类型的变量,如果这个指针没分配空间,并不知道这个结构体大小多少,这个指针不能指向另一个结构体所有成员。函数名作为参数传递时,就是回调函数。

2024-09-05 21:12:25 259

原创 数据结构(2)

1. 延迟解析(Deferred Parsing):•在 C 语言中,结构体声明可以出现在其他声明之前,这意味着编译器可以先看到结构体的名称,然后再看到其完整的定义。•解决方案:使用快慢指针,如果快指针追上了慢指针,则存在环。•解决方案:当快慢指针第一次相遇时,将其中一个指针重置到头节点,然后两个指针每次各移动一步,再次相遇时的节点即为环的入口点。这种方法通过设置两个指针,一个快指针(通常每次移动两步)和一个慢指针(通常每次移动一步),来解决各种链表问题,如检测环、寻找环的入口点、查找中间节点等。

2024-09-04 21:46:56 802

原创 数据结构(1)

解决内存碎片的方法1. 紧凑化(Compaction):•移动已分配的内存块,使其集中在一起,从而释放出连续的内存空间。•例如,假设内存分配器分配了 256KB 的内存给一个只需要 128KB 的程序,剩下的 128KB 就构成了内部碎片。•即使总的可用内存空间足够,但由于这些空间分散在不同的地方,无法合并成一个连续的空间,导致无法分配给新的请求。•例如,假设有以下内存布局:(数组)内存碎片的影响内存碎片会对程序和系统的性能产生负面影响,包括:•内存利用率降低:由于碎片的存在,无法有效地利用所有可用内存。

2024-09-03 19:31:40 770

原创 轻量级数据库

函数指针是一个指向函数的指针,它可以存储一个函数的地址,从而允许我们通过该指针来调用该函数。1. 回调函数:•函数指针常用于传递回调函数,即一个函数被作为参数传递给另一个函数,并在适当的时候由后者调用。create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);// 输出: Result: 5.000000。create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);

2024-08-29 21:16:58 850

原创 IO多路复用

文件描述符最多1024个,0stdin,1stdout,2stderro。

2024-08-28 22:49:03 122

原创 并发服务器和常见io结构

pthread_create 函数的第一个参数 pthread_t *thread 用于指定一个线程标识符的变量,这个变量用于存储新创建的线程的标识符。pthread_detach 函数用于将一个线程设置为分离状态,这意味着该线程完成后,它的资源将自动被操作系统回收,而不需要其他线程调用 pthread_join 来等待它完成。•返回值:•如果成功,返回 0。•资源回收:调用 pthread_join 后,被等待的线程资源会被回收。pthread_join 函数用于等待一个线程的完成,并回收该线程的资源。

2024-08-27 19:47:36 329

原创 网络抓包测试

2. \n 的处理:•如果在读取过程中遇到了 \n,fgets 会将其作为一个普通字符读取并存储到目标字符串中。•如果在读取 n-1 个字符之前遇到了 \n,则读取过程结束。•如果在读取 n-1 个字符之后仍未遇到 \n,则继续读取直到达到 n-1 个字符或文件末尾。利用fgets遇到\n停止的特性,给流数据直接加间隔,fgets读的时候会把soket缓冲区里面的数据全部放到fgets的缓冲区内,再读的时候就不能从套接字fd描述符读而是从fgets的fq里面读。# 查看 telnet服务是否开启。

2024-08-23 20:59:08 448

原创 网络通信tcp

1. 写入管道:•当一个进程通过 write() 系统调用向管道写入数据时,数据实际上是从进程的用户空间复制到了内核空间中的管道缓冲区。2. 从管道读取:•当另一个进程通过 read() 系统调用从管道读取数据时,数据又从内核空间的管道缓冲区复制到了用户空间的缓冲区。数据复制的过程1. 写入过程:•进程调用 write(),将数据从用户空间复制到内核空间的管道缓冲区。•这个过程涉及一次数据复制。•数据复制:数据从一个进程的缓冲区复制到内核空间的管道缓冲区,再从内核空间的管道缓冲区复制到另一个进程的缓冲区。

2024-08-22 20:05:21 557

原创 网络udp及ipc内存共享

下面是一个通用的帧数据格式示例:+----------------+----------------+----------------+----------------+•数据单元在不同层有不同的名称: •应用层:数据•表示层:数据•会话层:会话数据单元 (SDU)•传输层:数据段 (Segment)•网络层:数据包 (Packet)•数据链路层:数据帧 (Frame)•物理层:比特流 (Bit Stream)2. 数据解封装:•当数据从低层向高层传输时,每层都会去除自己添加的头部信息,还原原始数据。

2024-08-21 21:07:52 743

原创 有名管道,信号通信

半双工 ---发送端 和 接收端 同一个时刻之后有一个起效 ---对讲机。sig 当前程序要发送的信号编号 《=== kill -l。===>fun 有三个宏表示:SIG_DFL 表示默认处理。双工 ---发送和接收可以同时进行 --手机,电话。

2024-08-18 18:49:16 520

原创 进程间通信—无名管道

加锁顺序问题时,如果解锁了,两个同时申请抢锁,谁抢到了运行谁,循环迭代时释放锁也是同时申请锁,循环部分如果没抢到锁就进入循环等待。pipefd[1] ==>无名管道的固定写端//1 -- 标准输出。参数:pipefd[0] ==>无名管道的固定读端//0 -- 标准输入。有名管道 ===》fifo ==》可以给任意单机进程通信(同一主机内)无名管道 ===》pipe ==》只能给有亲缘关系进程通信。1、无名管道 ===》管道的特例 ===>pipe函数。管道中没有数据,则读操作不阻塞,立即返回。

2024-08-16 20:15:49 477

原创 线程的回收

1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。可结合性 --- pthread_join //这种用于 ,线程任务较短,主线程需要关心子线程状态。可分离性 --- pthread_detach //子程序执行任务较长,主线程也不需要关心子线程状态。2.pthread_detach //可分离属性 ---子线程运行很久才结束 --- 设置分离属性。//NULL 默认属性 --- 普通锁。

2024-08-15 20:20:31 585

原创 进程和线程

线程与进程的关系线程与进程的主要区别在于它们如何共享资源:•共享资源:•线程通常共享同一进程中的大部分资源,如内存空间、打开的文件描述符、环境变量等。•PCB 包括的信息通常有: •进程标识符(PID)•进程状态(运行、就绪、阻塞等)•CPU 寄存器的值(包括程序计数器 PC)•内存管理信息(如页表)•访问权限•等待的资源和条件变量•优先级•父进程和子进程的链接•时间片•I/O 状态信息3. 内存空间:•进程有自己的私有内存空间,包括: •代码段:存放程序的机器指令。•堆:动态分配的内存区域。

2024-08-14 19:23:19 716

原创 子进程与父进程运行不同程序

往文件里面写内容,fork在open之前,会接着父进程写的内容写,继承父进程的状态信息,文件描述符一直往下。3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。往文件里面写内容,fork在open之后,分别打开文件,后运行的会覆盖先运行的内容。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),

2024-08-13 20:45:12 917

原创 linux进程

这三个选项分别代表不同的含义:1. a:•显示所有进程,包括其他用户的进程。3. x:•显示没有控制终端的进程。使用 ps aux 的效果当你使用 ps aux 时,你会得到系统中所有进程的详细列表,包括以下信息:•USER:进程所有者的用户名。ps -elf 是一个在 Unix 和类 Unix 系统(如 Linux 和 macOS)中用于显示进程信息的命令行工具 ps 的一个特定选项组合。选项解释•-e:显示所有进程,包括其他用户的进程。•-f:显示完整的命令行,包括进程的父进程 PID 和执行的命令。

2024-08-12 20:59:00 1127

原创 gdb调试

用户名,网络上主机名。NULL上次位置加一。

2024-08-10 15:21:00 167

原创 时间函数链接函数等

3. 使用命令行工具:•如果您在命令行环境下使用文本编辑器,比如 vi 或 vim,可以使用特定的命令来全选文本。•例如,在 vim 编辑器中,您可以在正常模式下使用 gg 将光标移动到文件的开头,然后使用 vG 进入可视模式并选择整个文件的内容。10.终端中的全选命令1. 使用快捷键:•Ctrl + A:按下 Ctrl 键和 A 键,可以全选当前终端窗口中的文本内容。文本编辑器中的全选命令1. 使用快捷键:•在大多数文本编辑器中,您可以使用 Ctrl + A 快捷键来全选当前编辑器中的文本内容。

2024-08-08 18:59:30 897

原创 目录的读取

字符设备(Character Device)是一种特殊的文件类型,在 UNIX 和类 UNIX 系统(如 Linux)中用于表示与硬件设备交互的接口。字符设备文件允许进程以字节流的方式与硬件设备进行通信。文件IO 用于底层设备相关的开发,但是效率和安全性以及移植性没有标准IO方便。Inode:在硬盘里的编号,access访问的时间,modify修改的时间,change:修改读写状态的时间。links:两个文件名指向同一个内容,你删除其中一个文件,对另一个不影响,称为两个硬链接。fd:已经打开的文件描述符。

2024-08-07 19:42:18 874

原创 系统文件io

三、当在结构体中存放一个字符串时,如果字符串的长度超过了分配给该字符串的空间大小,结构体对齐规则本身不会直接影响字符串超出部分的处理方式。•如果结构体中前面的成员没有足够的空间来容纳字符串的溢出部分,那么字符串的溢出部分不会自动占用前面成员的空间。•但是,如果字符串紧跟着一个对齐要求较高的成员,那么字符串可能会开始于一个较大的对齐边界上,从而可能占用更多空间。1. 溢出到后续成员:•如果字符串超过了分配的空间,而结构体中的下一个成员紧跟着字符串变量,那么字符串可能会溢出到下一个成员的内存空间中。

2024-08-06 20:11:01 551

原创 标准io及用法

二、"流指针"(stream pointer)在 C 语言中通常指的是指向 FILE 结构的指针,它是用于处理文件输入输出的标准库中的一个概念。FILE 结构体的定义是不透明的,这意味着它的内部结构对用户来说是隐藏的,用户只能通过标准库提供的函数来操作 FILE 结构体。1. C 标准库:•libc.so 实现了 C 语言标准库的函数,如 printf(), malloc(), open(), read(), write() 等。nmemb 要获取的数据块的个数,拷贝的数据块个数。

2024-08-05 20:58:00 856

原创 shell脚本

4. 路径约定:•在 Unix 和类 Unix 系统中,/bin 路径是环境变量 PATH 的一部分,这意味着用户可以在任何地方直接调用这些命令,而不需要指定完整的路径。•# 是一个注释字符,但在这个上下文中,它与后面的!Bash 是一种广泛使用的 Unix shell 和命令语言,它是 GNU 项目的一部分,并且是许多 Linux 发行版默认的 shell。在计算机科学领域,特别是在 Unix/Linux 系统中,echo 命令被用来输出文本或变量的值到标准输出(通常是终端或命令行界面)。

2024-08-03 18:28:53 487

原创 共用体枚举

把取值范围限定在enum week类型里面,但是c语言和int可以混用,但尽量避免。*p ++,意思是(*(p)++),就是个a[i++],值就是a[i],同时p相加。类型定义,给已有数据类型叫别名。共用体:公用一个内存空间。让结构体写起来更简单。

2024-08-02 20:25:36 198

原创 结构体及链表

4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;第一个值域无效 ,有头,第一个节点只是为了承上启下 ,首节点来自栈区,头节点来自堆区。3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;链表由若干个节点组成node,

2024-08-01 18:17:54 317

原创 数组指针,指针数组,指针函数,函数指针

2.&a //这是一个基类型为数组的地址字节为80,指向整个数组,基类型是int 【10】,地址加1是加40字节。3.指针函数是函数返回值为指针,函数指针是 将函数的入口地址保存到指针里面,作用是解耦合。传的实际上是s[0]的值,只不过s[0]里面的指针指向字符串常量区里面的“Hello”&a[0] //地址字节是8,指向第一个元素,基类型是int *2.指针数组,数组里面每个元素都是指针 int * a[10];1.数组指针:数组的指针,指针指向数组。作为实参传递,形参是指针的指针。

2024-07-31 19:57:49 199

原创 快速排序及指针用法

五、const关键字可以让无法直接访问内存空间修改变量,可以间接访问内存空间 修改变量。在指针前面加const前面无法通过该指针修改指针变量所指向的变量(只能读不能写)三、两指针不可求和,可求差,差值为n个基类型,两指针及类型必须一致,否则报错。九、malloc(size)动态分配内存 ,且一定是连续的。八、返回值为指针的函数不能返回局部变量的地址。realloc(p,size)扩容。六、字符串常量区内容只能读不能写。四、递归调用求字符串有效长度。七、void *万能指针。free(p)释放内存。

2024-07-30 19:53:11 149

原创 c语言整型指针

野指针是指针的一种状态,指的是指向不确定或无效内存地址的指针。野指针通常会导致程序行为不可预测或崩溃,因为它指向的内存区域可能是未分配的、已被释放的或者是其他用途的内存。比如未初始化的指针:指针变量在定义时未被初始化,它的值是随机的,因此它指向的内存地址也是不确定的。(*取地址运输符)间接访问。p+几,差几个sizeof(基类型)返回值是指针的函数叫指针函数。整型是用来装整数的数据类型。指针是用来装地址的数据类型。空指针,意味指针不能被访问。对地址对应的内容进行改变。

2024-07-29 17:39:22 235

原创 函数调用关键字及预处理

register int x,定义为寄存器变量,把存储空间开到Cache里面,而不是在ram中,cpu寄存器里面没有地址取x地址的话报错。C.在两个或两个以上具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见。.{}里局部作用域里面是局部变量,{}外全局作用域里面是全局变量,在静态区(全局区)调用外部函数 ,在使用函数前对函数要进行声明,一定是声明而不是定义,并且形参可以省略。在h文件只声明不定义,#include"fun.c",自己写的函数一般写双引号、

2024-07-27 20:12:45 335

原创 编写关于数组的函数

函数参数传递时,如果是数组传递,传递的是数组地址,在64位系统中占8个字节。在二维数组传参时候,行数需要在主函数中计算,列数可以在函数中计算。const char 既能是字符串常量也能是数组的数组名。1.加const可以提高代码的适应性。2.字符型数组常用函数功能实现。3.二维数组函数常见功能实现。传参时候要类型匹配数量相等。

2024-07-26 19:40:54 220

原创 函数传参规则

生命周期:堆区中的数据在程序运行期间可以动态分配和释放,通常需要显式地使用malloc、calloc、realloc和free等函数来管理。访问速度:堆区中的数据访问速度较慢,因为涉及到更多的内存管理开销。生命周期:栈区中的数据随着函数调用的开始而分配,随着函数调用的结束而释放。:字符常量区用于存储字符串字面量,即直接在代码中定义的字符串常量。特点:字符串字面量通常存储在只读内存区域中,共享相同的字符串字面量可以节省内存。:代码区用于存储程序的可执行代码,包括函数体和常量字符串等。函数传参顺序自右向左。

2024-07-25 19:45:52 295

原创 二维数组和函数调用

a是数组a[0]首元素地址,实际是一维数组a[0]首元素地址。a[0]实际是一维数组的数组名,代表的首元素地址。a[][]可以省略靠近变量名的[]a[0][0]代表一个数字。形参和实参数量相等类型匹配。形参必须每个都要声明类型。

2024-07-24 21:02:35 161

原创 字符数组及其相关函数用法

字符串比较strcmp(s1,s2) 字符首字母ascii比较(s1[0]>s2[0]),输出>0。字符串拷贝strcpy(目标数组名s2,源数组名s1)字符串连接strcat(目标数组名s2,源数组名s1)strlen(s)计算有效字符长度,不加'\0'字符型数组是用来存放字符串的容器。sizeof(s)所有的字节数。html超文本标记语言。

2024-07-23 19:05:56 133

原创 数组及其算法

数组存放单一性(字节占用都相同,均匀分配),有序性(由a[0]到a[9]地址由小到大),连续性(数组地址之间没有间隔),如果写a[10]=100是越界访问(段错误一般是越界访问)一维数组元素int a[10],表示从a[0]到a[9]的整型变量,定义数组时的[]只是类型说明符,说明只是数组,后面的a[0]中的[]表示下标运算符。数组的数组名代表首元素的首地址(a=&a[0],a是地址值常量,是右值,不能整体赋值)不初始化,元素都是随机数,初始化哪怕1个,其他元素都为0。空间复杂度:所占存储空间的大小。

2024-07-22 20:50:24 177

原创 循环结构语句

while 循环会不断读取字符直到遇到换行符,这样做的目的是确保在读取运算符 op 之前,缓冲区中的任何无关字符(包括换行符)都被清除掉。先执行表达式1,再执行表达式2为真,执行循环体然后执行表达式3,若为假结束循环执行下面语句。do while 循环体至少执行一次再判断,while必须先判断再执行,使循环趋于结束语句)while(循环执行条件),()为真,执行循环体。内层循环跑的快跑完后,外层循环才循环。sum的值会是初次跳出循环的值。执行name对应的语句。使循环趋于结束的语句。do while语句。

2024-07-20 17:21:01 290

原创 选择结构(if和switch语句)

如果有多个else if 语句,第一个为真执行了后面就不执行,第一个为假,继续执行。与运算时左操作数为真时右操作数不计算。&&逻辑与 ||逻辑或!前面为真输出:前面的表达式,否则输出后面的表达式。4年1闰,100年不闰 || 100年闰 400年再闰就是闰年。三、表达式截断,或运算时左操作数为假时右操作数不计算。if语句嵌套表示逻辑与,嵌套尽量不超过5层。case 'A'和case 'B'是逻辑或。常量写前,变量写后,避免写成=%#x,输出0x12。

2024-07-19 19:34:47 301

原创 数据输入输出

s打印字符串常量 const char*变参只能是“world”形式,const char表示一个限定不会被改变的指针变量,它指向的内容是不可变的,即不能对其内容进行修改。这是因为当你将一个变量作为参数传递给一个函数时,实际上是将该变量的值复制给了函数内的形参,因此在函数内部对形参的修改并不会影响到原始变量。不能在被调函数中修改主调函数中的变量,printf(),开辟内存空间作为形参的内存空间,并复制主调的数值到形参里面。%g%G即可能输出%f也可能是%e,由哪个输出短输出哪个。

2024-07-18 18:50:59 208

原创 数值型数据间的混合运算及不同数据类型间的混合赋值

int型到float型添小数 int型到short型保存低位( 高位截断)short型到int型在低位正数补0,负数补F (符号位扩展)十、赋值转换 float到int小数截断,float的符号阶码尾数形式转换为整数的补码形式。七、 ++i先加再用 i++先用再加,先复制一份到内存空间(临时变量),再在原存储空间加1。九、用类型转换符转换是显式转换 (可能临时带来部分信息的丢失)不会修改操作数本身,q且都是右值。初始化是开辟内存空间并赋值。

2024-07-17 18:32:52 629

空空如也

空空如也

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

TA关注的人

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