- 博客(41)
- 收藏
- 关注
转载 常见汇编指令
CMP比较指令用于比较两个寄存器的值或者比较一个寄存器和立即数的值,其原理是对待比较的两个数求差,看结果是否为0,这个指令会无条件修改N,V,C,Z位。汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位。将R0寄存器中的数据存储到R1寄存器指向的内存地址加上R2寄存器的值的位置。将R0寄存器中的数据存储到R1寄存器指向的内存地址中,并将R1的值增加4。将R0寄存器中的数据存储到R1寄存器指向的内存地址加上4的位置。
2024-09-19 21:50:57
313
原创 framebuffer帧缓存
framebuffer本质上是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。framebuffer驱动程序控制LCD显示设备,通过映射framebuffer设备到用户空间,应用程序可以直接对显存进行操作,从而控制LCD显示内容。显示屏:800*600(横向有800个像素点,纵向有600个像素点)所以可以采用内存映射,将用户空间与显存空间建立起一一对应的关系。2.获取显示设备相关参数(分辨率、位深度)1.打开显示设备(/dev/fb0)显卡(显存(保存像素点的值))
2024-09-10 21:34:39
588
原创 哈希表、算法
在编程和数据结构中,"hash" 通常指的是哈希函数,它是一种算法,用于将数据(通常是字符。将要存储的关键字与要存储的位置建立一种联系,这种联系就叫哈希函数/散列函数。一般用大0表示法:0(n)------>时间复杂度是关于数据n的一个函数。希函数将键映射到表中位置的数据结构,以实现快速的数据插入和检索。3,如果最高阶存在且系数不是1,则去除这个项相乘的常数。随着n的增加,时间复杂度增长较慢的算法时间复杂度低。2,在修改后的运行函数中,只保留最高阶项。便于交流,阅读,理解 高内聚,低耦合。
2024-09-09 19:27:28
922
原创 树和二叉树
前三种称为深度优先,层序遍历称为广度优先已知一种排序,不能还原出唯一的二叉树已知前序+中序 --->唯一的二叉树已知后序+中序 --->唯一的二叉树但是知道前序和后序不能还原。
2024-09-07 18:02:00
1357
原创 栈和队列
遵循先进先出(FIFO,First-In-First-Out)的原则,即最先添加到队列的元素会第一个被移除。:遵循后进先出(LIFO,Last-In-First-Out)的原则,即最后添加到栈的元素会第一个被移除。栈的内存分配和回收是自动的。:由于其 LIFO 的特性,栈的内存利用率通常较高,因为栈顶的内存可以快速地被重新利用。系统栈:用于跟踪函数调用的顺序和状态,包括存储局部变量、参数、返回地址和函数的执行环境。:无论是数据栈还是系统栈,都遵循 LIFO 的原则,即最后进入的元素会第一个被移除。
2024-09-06 21:08:29
1122
原创 内核链表及使用
内核链表是操作系统内核中用于管理内存中数据结构的一种方式,特别是在Linux内核中。它提拱了一种灵活且高效的方法来组织和管理数据,如进程、缓冲区、定时器等。内核链表的设计允许快速插入、删除和遍历节点,这对于需要高效率和实时响应的内核操作至关重要。
2024-09-05 21:42:15
573
原创 基于TCP的web端服务器数据库查询商品
该系统为创建网络并发服务器,搭建HTML网络页面框架,通过HTTP超文本网络传输与用户建立连接(TCP建立连接),从自己建立的数据库中查询用户所需信息,使用户能在网页中直接查询相关内容。本系统包括4个页面,包括(一级登陆页面,二级商品查询信息页面,三级商品概述页面,四级商品详情页面),使用户可以精准查询。网页界面:分为四级网页界面:分别是登录页面,查询页面,商品页面,商品详情页面。已经accept后的套接字connfd,接收到的http请求,请求的大小。查询页面:输入待查询的商品名称。
2024-09-04 20:45:39
764
原创 数据结构与算法
用来操作数据,如果数据为局部,使用后销毁,则指针就成了野指针。二维数组:char buff[10][1024]:用来保存多个数据。数组:cahr a[1024]:开辟出一块空间用来放自己的数据。线性结构:一对一的关系:(表(数组,链表),队列,栈....)索引存储:通过关键字构建索引表,通过索引表找到数据的存储位置。指针:char *p:用于间接访问已有的数据的地址。图形结构:多对多的关系:网状结构。树形结构:一对多的关系:二叉树。顺序表--------->数组。链式表--------->链表。
2024-09-03 20:07:32
711
原创 数据库sqlite3
文件 ----------------------->硬盘:程序运行结束,掉电数据不丢失。create table 表名(列名 数据类型,列名2 数据类型,列名3 数据类型);*降序排列:select * from 表名 order by 列名 DESC;条件查询:*select * from 表名 where 列 关系运算符 值*;数组、链表、变量 ----->内存:程序运行结束,掉电数据丢失。数据库:专业存储数据、大量数据 ----->硬盘。select 列名1,列名2,from 表名;
2024-08-29 21:02:53
1240
原创 基于网络技术的天气数据查询
实时数据查询: 用于收集实时数据查询所需要的所有数据, 调用网络数据查询模块, 同时对网络数据查询模块的返回值进行整理, 使其按照规定的格式返回控制台进行显示,并且把查询结果暂存到缓存区用于后续的打印,查询时间区间为以输入有效的终止时间的时刻为准的操作系统时间为起始时间, 以输入的终止时间为结束时间。时间段数据查询: 用于收集时间段数据查询所需要的所有数据, 调用网络数据查询模块, 同时对网络数据查询模块的返回值进行整理, 使其按照规定的格式返回控制台进行显示, 并且把查询结果暂存到缓存区用于后续的打印。
2024-08-28 12:46:32
526
原创 tcp通信以及wireshark抓包
tcp在传输时,有可能就会将两次发送的内容粘到一起,这是由于tcp的第三个特点:字节流式传输。它不一定会将两次发送出来的数据进行严格区分。recv和send与read write相比较唯一不同的是多了一个flag,表示recv和send 专用于网络。但是socket在底层发送东西的时候是会在一段时间中等待的,若短时间内未收到接下来的信息,也就会直接发出去。Telnet 应用层协议(基于tcp的应用层协议)1.规定一些数据与数据之间的 间隔符。导致: 可能多次的数据粘到一起。2.可以指定要发送的数据的长度。
2024-08-23 19:42:30
402
原创 TCP、UDP
服务器端:socket --->bind ----> recvfrom //保存了客户端的地址 srcaddr----> sprintf ---->sendto // srcaddr。客户端:socket --- > //fgets(实现多次通信)----> sendto ----> recvfrom ---->printf。-----好 ---------------->-----好 ----------------><----我也要断开----------每一个应用程序进程有一个端口号,
2024-08-22 20:28:19
649
原创 IPC 进程间通信方式
b/s browser server 浏览器-服务器模型 ------ 通用客户端。c/s client server 客户端-服务器模型 ------ 专用客户端。//client ---------客户端 ----角色 ------主动的角色。//server --------服务器端 -----角色 ----被动的角色。可以将socket当做一个特殊的文件。//用来标识网络中的一台主机 ---- 通过ip可以找到对应的一台主机。//1.一种特殊的文件 -----专门用于网络通信(不同主机间的进程)
2024-08-21 21:23:30
831
原创 有名管道和信号
对于SIGCHLD信号,无论子进程是正常结束还是异常结束,都会发送这个信号到父进程。信号 被称为 软中断 (软件层面 对中断过程的一种模拟)1.有名管道 特殊文件,但是在系统中有一个名字。pathname :创建出的管道文件的文件名。3.有名管道 操作 符合 前面管道操作特点。handler:要对这个信号做怎样的处理。4.管道中数据 遵循fifo的读写规则。//2、如果,步调一致 ----同步。signum:要处理的信号的 编号。不能被阻塞,不能被忽略,不能被处理。如果,步调不一致 -----异步。
2024-08-17 20:43:03
359
原创 互斥锁以及进程间通信
Pshared:用来指定这个信号量是用在进程还是线程中的(0 :线程 不为0:进程)//2.不能重复买票,将100张车票均匀的从两个窗口卖出即可。pipefd //用来获取 管道的两端 //读端pipefd[0]可以读管道,但是管道中如果没有数据了,此时 读操作 不阻塞。可以读管道,但是管道中如果没有数据了,此时 读操作 阻塞。数组管道的两端就是读写,数组的0号指针是读端,数组的1号指针是写端。信号量集() //信号量 (6)
2024-08-16 20:11:24
833
原创 线程的退出
1.pthread_join //需要自己回收 -----线程的属性(可结合性) --一般是子线程 在短时间内运行完。带来了资源竞争 //专门的技术 解决资源竞争 ----互斥 同步。retval //退出状态值 //需要传的是,退出状态值的地址。2.//可分离属性 ----子线程运行很久才结束 ---设置分离属性。Pthread_mutex_unlock() //解锁。Pthread_mutex_lock() //加锁。pthread:要结束的线程的tid号。
2024-08-15 20:03:48
1088
原创 进程的结束
此时不需要写入文件的路径,只需要填入要执行的可执行文件的文件名 //可执行文件必须在系统的/bin目录中。3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。2.父进程创建出子进程之后,子进程做的事情与父进程完全不同 //自力更生。用一个新的进程的镜像取代(各个段)当前进程的镜像(各个段),但不包括pcb。c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。多任务 : 淘宝服务器 程序 ------创建子程序。
2024-08-13 21:10:46
601
原创 进程与线程
1.进程网络编程进程(process):进行中的程序 ----正在运行中的程序进程 -- -程序的一次执行的过程进程 是程序的一个实例进程 vs 程序程序是在内存中运行的程序 --- 静态 --- 硬盘进程 --- 动态 --- 内存。
2024-08-12 20:36:48
733
原创 目录文件属性
如果使用了一个结构体要查找这个结构体的成员,不能直接使用man 指令,而是应该用man 指令查找使用这个结构体的函数名。DT_CHR:字符设备,键盘鼠标等,一个字符一个字符的读/写,字符与字符之间有顺序。在Linux中,以.开头的文件是隐藏文件,.代表本层 ..代表上层。文件名和文件内容是分开放的,文件名不在stat里,而是在目录中。info*:一项,目录中有很多项内容,info代表其中的一个。目录名区分大小写:重名的文件和目录不能在一个目录下同时存在。d_type:判断这个文件是七种中的哪一个。
2024-08-07 20:11:17
956
原创 文件IO及缓冲区
再用偏移量写+10的话,就会跳到字符串之后再偏10.这个时候需要写入一个字符,文件的长度才会变大,在偏移量与最后一个字符之间的这部分空白会自动补零。.2操作对象不在是流,而是文件描述符FILE* ,本质是一个数,数字代表一个即将被操作的资源: int 0-1023。返回值是写入的字节数,但是0也不一定是错的,该函数也可用在网络中,反0也可能只是因为当前网络比较拥塞。通过文件流指针来控制。文件描述符,要写入的内容,实际写入的长度(buf的有效长度)文件描述符,从那里读,最大可以读的长度(即Buf的长度)
2024-08-06 20:41:38
910
原创 文件I/O
因为fgets和fputs每一次复制都是一个字符串,是以0为结束标志的,但是图片在内存中以二进制存放,有极大可能会出现00这样的数,fgets会将此误判为截断标志,那么复制的字节数就会远小于原有文件的字节数,导致数据丢失,因此不可用来处理图像。系统提供的三个流指针(FILE*):当a.out开始运行的时候,系统就会自动调用这三个流指针。Char buf[]中,[]内的数据长度指的是要打开的文件一行的长度。一般情况下,这里是void*的时候,传的是二进制的。所以开的buf的空间应该尽可能比原有文件字节数长。
2024-08-05 20:33:11
496
原创 shell脚本
输出echo :“aaa,bbb,$a”:双引号会将$a,自动替换为值,‘aaa,bbb,$a’单引号原样输出。d:目录 L:软链接(快捷方式) p(pipe):管道文件,给不同进程之间共享数据。终端是一个正在运行的程序,pid就是一个程序编号,正在运行的程序编号。$#与argc相同就是计数,区别是$#在计数的时候不算命令本身。组用户(批量用户,一个班的其他同学);在脚本中,若test返回的结果为0,是真,非0为假。脚本中赋值,不需要给变量定义类型,读变量的时候要加$,写的时候不需要。
2024-08-03 18:49:54
465
原创 结构体及其应用
各个节点都是主程序在不同时间malloc申请来的,所以前一个节点和后一个节点的地址不连续,那么就不能用phead+1去查找下一个,只能一个一个挨个去捋一遍。结构体亦可以通过指针进行传参,通过指针传参只需要8个字节,而如果通过值传递需要原有结构体那么大的空间,指针传参效率更高。int是抽象的,i是具体的。,并且每个成员的首字节放置的位置必须能够整除成员的字节数;首节点的下一个节点称为头节点,是指针开始需要的节点。,合法的n的数值分别是1、2、4、8、16。部分初始化,剩下未初始化的部分是0,是。
2024-08-01 20:02:14
512
原创 数组指针,函数指针
回顾:字符串在字符串常量区,若两个指针中存的都是helloworld!,那么就没必要在内存中存两份,那么puts的输出结果为yesPrintf中不一定只能传“”,也可以传数组的首元素。
2024-07-31 20:21:50
291
原创 字符串指针及指向函数的指针
要包一个头文件<stdlib.h>malloc(申请的空间不在栈上,在堆上)将你申请的大小的内存空间的首字节的地址返回 malloc可以保证你所申请的内存空间一定是连续的。指针的主要作用就是实现在被调函数中修改主调函数,前提是在调用函数时要把要修改的参数的地址传给被调函数。用malloc有可能申请不到,若申请到内存,则返回申请到的内存的首地址,若申请不到,则返回一个空指针。//表示p不能改变,p指向的内容(*p)也不可以改变。//表示p不能改变,但是p指向的内容(*p)可以改变。
2024-07-30 20:25:59
1035
原创 指针和地址
基类型 * 指针变量名;基类型:将来要定义的指针要装的地址是什么类型int *p:只用来装int型指针变量p指向变量i指的是:p中放的是的地址下面都是合法的定义:(pointer_3是指向float型变量的指针变量)(pointer4是指向字符型变量的指针变量)指针变量指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。下面的赋值是不合法的:/*pointer_1为指针变量,100为整数*/类比:整形是用来装整数的数据类型。
2024-07-29 18:51:34
533
原创 数组作为函数参数
(3)在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。这里算不出来行数,就是因为a是首元素的地址,而地址是8个字节,然后a[0]是一行,这里一行有4个元素,且每个元素都是Int型的,所以是16个字节。由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与用变量作实参一样,是单向传递,即。在传递时,传的a是数组首元素的地址,在64为架构下,长度为8个字节。
2024-07-26 19:48:07
1774
原创 函数的调用
return语句后面可以跟表达式,只要return 后面的返回值和定义的返回值相同就行注意:ch是一个三行三列的字符型数组字符数组初始化的末尾有一个'\0',表示这一行的结束,因为BBB刚好等于字符数组的列数,末尾的'\0'无处存放,在打印ch[1]时的结果为BBBCCc语言中的逻辑结果其实是一个整形,(返回的int型其实是一个逻辑结果)且非零即为真函数在调用过程中,发现参数给错了的解决办法1、判断一下条件,不符合的返回一个-12、用assert函数,使用这个函数需要加头文件。
2024-07-25 20:05:22
631
原创 二维数组及函数
定义:从无到有声明:将函数名,函数参数的个数和参数类型等信息告知编译系统类型标识符函数名(形式参数表列)声明部分语句部分类型标识符:就是函数的返回值的类型函数名:标识符,符合标识符的命名规范返回值:运算结束后,得到的结果的数据类型,通过return语句获得设计函数时,每个形参表中的形参的类型必须 单独定义。
2024-07-24 20:24:13
1044
原创 day8 字符数组
在C语言中,字符数组的定义方式大概是这样的:这里,char 表示字符类型,str 是数组的名字,[6] 表示这个数组可以存储6个字符(包括最后的空字符\0,它是字符串的结束标志)。"hello" 就是被存储在这个数组中的字符串。形如这样的数组就相当于一个容器:开辟出了一个占100个字节的数组空间,内容存放的是随机数注意:这个定义的字符串的长度要足够大,最短也要是len+1。
2024-07-23 19:32:04
706
原创 day7 一维数组
1、类型不匹配 2、a中有十个元素,没说把哪个赋值成100 3、a在程序中代表数组首元素的地址,在内存中是一个常量,不能赋值。3、对全部数组元素进行赋初值时,由于数据个数已知,可以不指定数组长度。例如:int 【0】={0,1,2,3,4,5,6,7,8,9}例如:int 【0】={0,1,2,3,4,5}例如:int 【】={0,1,2,3,4,5}常量表达式:>=1且只为整数,表示数组的大小。类型:任何已有类型,但不能是void型。1、在定义数组时对数组赋初值。2、只给一部分数组元素赋值。
2024-07-22 23:46:02
209
原创 day6 循环控制
2、用while 和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。continue语句只结束本次循环,而不是终止整个循环的执行。可以应用在switch-case语句中用于跳出switch结构,用于执行下一个语句,也可以用来从循环体内跳出循环,提前结束循环。for 语句可以用于循环次数已经确定的情况,也可以用于循环次数不确定而只给出循环结束条件的情况,完全可以代替while语句。其作用为结束本次循环,即跳过循环体下面未执行的语句,接着进行下一次是否执行循环的判定。
2024-07-20 17:48:10
488
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅