自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式LINUX-------------数据库

create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);insert into 表名称 values(NULL,“zhangsan”,类名称 数据类型, .......);create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);保存查询到的每行的每列的数据的指针数组;查询道德每列名字的指针数组;UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值;

2025-08-23 23:57:00 711

原创 嵌入式LINUX——————网络TCP

目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.0--65535,接收端根据自己的能力,去调整窗口的大小,65535的时候,接受端处理能力最强,发送端可以发快一点。每一个tcp头部有个序列号和确认应答号,TCP给每一抱会有一个序列号,发送方会把第一个编号给序号,在接受方应答的时候,会把确认序列号置最后一个编号的下一个编号回应。在双方通信时,发送方的发送数据类型不一样,接收很难确认和区分接受的大小;

2025-08-23 09:16:32 1064

原创 嵌入式LINUX—————HTTP(爬虫报文头的书写)

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。(3)怎么使用户能够方便的查看文档数据 HTML(超文本标记语言) ----浏览器端如何展示请求到的万维网数据。(2)用什么样的协议实现万维网上的各种链接 HTTP-----万维网服务端与服务器之间如何通信。(1)怎样标识分布在整个互联网上的文档 URL------万维网服务端如何区分请求的数据。404 Not Found //请求资源不存在,eg:输入了错误的URL。

2025-08-17 23:46:38 550

原创 嵌入式LINUX——————TCP并发服务器

底层对于集合表的方式改变,变成了链表,时间复杂度O(n),其他问题未被改善,仍然需要反复拷贝、遍历、只可工作在水平触发模式;水平触发:数据从无到有,先触发一次读,没读完,再触发读,一直到读完了,才不触发;边沿触发:数据从无变有,从低电平到高电平,触发一次,称读数据的上升沿触发;select只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式);3)通过函数接口,把集合传递给内核,并开始检测IO事件(输入输出、读写事件);在应用层每次需要遍历才可找到到达的事件的文件描述符,效率不高,还耗时;

2025-08-17 23:34:45 871

原创 嵌入式练习项目——————抓包获取天气信息

根据示例,我们需要先判断success里的数据是否等于1,也就是数据是否接收成功,然后再去找到节点result访问里面节点存放的数据,从抓包获得的响应可以看出节点里存放的数据都是字符串,使用valuestring(例如:提取节点weaid里的内容,weaid->valuestring)通过调用里面的函数对提取到的信息进行解析打印,根据抓包获得的响应可以看出,我们选择当前天气时收到的信息应该是一个类似于数组的东西,里面存放着键值对,以树的形式连接。的核心函数,生成一个包含所有JSON数据的。

2025-08-17 23:17:30 1758

原创 嵌入式LINUX——————抓包

目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.0--65535,接收端根据自己的能力,去调整窗口的大小,65535的时候,接受端处理能力最强,发送端可以发快一点。已发送并且收到应答的数据、已发送未收到应答的数据、未发送但在对方处理能力内的数据;

2025-08-14 18:10:24 1136

原创 嵌入式LINUX——————网络

1)应用层:用来表示用户发的数据内容和格式2)表示层:数据加密,解密操作,压缩,解压缩3)会话层::建立数据传输通道4)传输层:传输的方式 UDP TCP 端口号5)网络层:实现数据路由 路由器 ip6)数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP7)物理层:定义物理设备标准,网线、光纤等传输介质 比特流 bit 0 1。

2025-08-14 18:09:36 1093

原创 嵌入式LINUX—————系统编程

so动态库:stdio.c=>libc.so:gcc的前三步,so文件已经是二进制,也叫c库文件,调用系统级别的头文件,传入的是so动态库,路径在:usr/lib。FILE是文件流指针,描述文件相关信息,打开之后,只关心文件的内容,FILE结构体内部有个成员指向文件的文本;(1)功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应的本地内存(栈区数组,堆区内存)(1)argc:参数的意思,命令行参数的个数有几个;流对象 ===》头 《===数据====》尾。

2025-08-08 18:12:02 1101

原创 嵌入式LINUX--------线程

如果sem没有资源(==0),则线程阻塞等待,一旦有资源,组自动盛情资源并继续运行;为了保证临界资源(共享资源)的完整操作,增加了锁的机制,即同时满足互斥访问(线程1访问,线程2不可被访问),+原子性操作(访问的整个过程必须完整,不可被打断)。-------有顺序的访问。定义互斥锁 ===》 齿梳化锁 ===》 加锁 ===》 解锁 ===》 销毁。原子操作----要么不操作,如果要操作,一定是一次性完成的操作,不可被打断;value:信号量的初始值,一般无名信号量-------代表一类资源的个数;

2025-08-08 17:54:55 782

原创 嵌入式LINUX-----------进程通信

(3)system Ⅴ ===》系统Ⅴ 进程间通信方式 inner Process Comunication。管道的读写规则:管道的读端存在,写数据 ,有空间,可以一直写;满了,此时写操作阻塞,等读了4k之后,阻塞消失;⑤消息队列(消息都有类型 可以选择接收哪种类型的消息)【了解】===》本地套接字 网络套接字。前六种包括socket的本地逃跑戒子===》同一主机内进程间通信。无名管道 ===》没名字(父子进程间通信)(4)⑦socket ===》套接字。有名管道===》有名字。

2025-08-06 18:02:09 166

原创 嵌入式LINUX----------线程

局部变量 ----------- 如果传进去局部变量的地址,并且在线程内进行修改,是共享的,如果是传进去,但是没有对地址进行修改,用一个线程内的局部变量,则是不共享的。补充:可结合(线程的属性):决定了线程资源回收的方式,这个线程结束时必须有其他线程进行pthread_join ----------- 手动回收。attr-------------线程的属性//NULL(默认属性:可结合性)线程时依附进程的(多个线程共享进程的资源;arg-------------给线程的回调函数的参数。

2025-08-06 18:00:04 738

原创 嵌入式LINUX---------父子进程

(1)用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。(1) 库函数,退出状态,终止的进程会通知父进程,自己使如何终止的。孤儿进程:父子进程中,父进程先消亡,子进程就变成孤儿进程,该子进程就向上找结点,它的父进程发生变化;(3)参数:status:进程退出的状态(正常退出括号内写0,非正常退出(异常终止),传1)2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。

2025-08-06 17:44:46 591

原创 嵌入式LINUX---------进程

3个状态,就绪→执行态→阻塞(等待,睡眠,scanf)基本操作系统linux中的状态,运行态,睡眠态,僵尸,暂停态。(4)写时复制:在fork之后,子进程先不开0~3g空间,在变量发生改变的时候(不管是父还是子的),才会开空间,,如果只是读的话,那就不另开空间,开的空间小,回收的时候也快;2)void exit(int status), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。3) 变量不共享(),父子空间独立,各个段都是独立的,互相之间的数据操作,互不影响。

2025-08-06 17:34:18 1001

原创 系统编程——文件IO

1.打开目录(opendir):DIR *opendir(const char *name);2)返回值:成功返回1970年到现在的秒数,失败返回-1。(3)返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL。(3)返回值:成功返回保存日历时间结构体的指针,失败返回NULL。(1)功能:从目录流中读取文件信息并将保存信息的结构体地址返回。4)返回值:成功返回偏移量,失败返回-1。(3)返回值:成功返回目录流指针,失败返回NULL。(4)返回值:成功返回文件描述符,失败返回-1。

2025-07-25 19:39:28 777

原创 系统编程——文件IO,标准IO

文件io一般对设备文件操作,也可以对普通文件操作,注意:c库封装了系统调用,c库更通用可以跨平台,系统调用只适用liunx)第三方:不是系统提供的,用户自己安装的。1)与scanf区别:如果接受字符串,stdin接受可以有空格,结束标识是\n,并且\n也被接收,scanf如果接收空格则表示接收字符串完毕,如果是回车\n去缓冲区了。4)stream 要写的目标文件流对象。(1)缓冲区大小4k,主要用于文件的读写,缓存区满刷新缓存区,对普通文件进行标准IO操作,建立的缓存一般为全缓存,一般用于写操作。

2025-07-25 19:30:31 710

原创 数据结构——数,哈希

3.内核链表的思想:普通链表的数据耦合度太高,内核链表链表把表头和数据摘开,那就自己定义一个结构体,结构体内部包括结点和数据,那就可以把整个链表的增删改查独立出来,让链表的通用性更强;n个结点的有限集合,集合要么为空树,要么由一个根结点和两棵互不相交,分别称谓根结点的左。度为0的结点称谓叶结点。中序,左根右,先从根开始(不是先访问根),从左开始访问,在访问根,在访问右结点。(1),斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。树的度数是指,这棵树中,最大的结点的度数,称谓树的度数。

2025-07-18 20:34:01 649

原创 数据结构——双向链表

gcc main.c doulinklist.c //开头必须tab不能是几个空格,规则,打命令;a.out : main.c doulinklist.c//通过依赖文件可以产生目标;rm a.out//可以删目标文件、中间生成的文件,只留最后的需要文件;(1)工程管理工具,三个以上编译要写,如果在实际中.c比较多,改了其中的一个.c,只编译这一个.c文件;如果想在没有改代码的前提下再次编译,先make clean ,再make。SRC +=doulinklist.c //追加。

2025-07-18 20:00:35 375

原创 数据结构——单向链表

(2)链表是逻辑结构连续物理结构(在内存中的表现形式)不连续。(2)链表, 不需要预先分配,大小可变,动态分配。(1)顺序表 需要预先分配空间,大小固定。(1)顺序表是一段连续的存储单元。单向链表找倒数k个节点。三、顺序表和链表 优缺点。3.单向链表找中间结点。6.判断是否循环列表。

2025-05-22 09:27:49 307

原创 数据结构——链表

(1)为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。这两部分信息组成数据元素ai的存储映像,叫结点(Node);(1)线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。(2)也就是说前面的顺序表只需要存储数据元素信息就可以了。1.线性表的链式存储目的:解决顺序存储的缺点,插入和删除,动态存储问题。

2025-05-22 09:23:04 184

原创 数据结构——线性表

(2)当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。(2)链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。(1)顺序存储,数据存放在连续的存储单位中。1,输入,输出特性,输入时可选的,输出时必须的。

2025-05-22 09:11:05 1314

原创 C语言——结构体

4.打印枚举都可以用%d打出,sizeof是4,printf(“%d”,w);3.访问:对共用体进行访问时的结果,是对最后赋值的成员的结果;(1)默认按照计算机位数对齐,64/8=8最终大小必须是8的整数倍;共用体在里面的作用时降低通信内存的负担,提高通信的效率;1.目的:创建一个数据类型,枚举一些需要的,这个数据类型的范围就是所枚举的;2.使用:此时INT不是变量名,是个数据类型名,给int起了别名INT;(2)从结构体中的成员中查找最大字节的成员,最终按此成员大小对齐;(3)右移:有符号位称算术右移;

2025-05-21 10:24:57 1274

原创 C语言——字符串指针

(2)用法:把函数声明去掉函数名,在去掉的位置上加(*p),eg:int (*p)(int a,int b);(3)realloc函数:作用是相当于重新开一段新的空间,将原来空间的内容拷贝到新空间,并释放原来的内容;当主程序结束时,垃圾回收器会回收未释放的指针,(只适用于有操作系统,不适用于裸机程序);(2)不能返回局部变量的地址,但是也可以在局部变量前面加static让变量的生存期变为静态生存区,常用传入一个指针,返回该指针,(1)函数的形参是指针的指针,实参是指针数组,也被成为二级指针;

2025-05-21 10:15:42 495

原创 C语言——数组指针

3.void *:万能指针,可以接受任何类型的地址,但是万能指针不能作为指针进行指针运算,常要与强转搭配使用,一般是写代码自己也不知道是什么类型,降低程序耦合性。数组指针:int (*p) [10]:是指向长度为10的整型数组的指针,保存了一个地址,为该整型数组的首元素地址;(1)二维数组名就是指向长度为cols长度的一维数组首数组指针,一维数组名相当于指向该一维数组的首元素的数组指针;(1)格式:基类型 (*指针名)【元素个数】;(2)区分指针数组和数组指针。(6)strncpy函数。

2025-05-15 19:29:03 431

原创 C语言——指针

3.为了杜绝野指针的出现,int *p = NULL/p =NULL,p称为空指针,空指针无法进行指针运算,他代表指针的状态,表示该指针指向的空间不可被访问;(2)减号两端可以都是指针,必须要保证两个指针的基类型一致,相减之后的表达式时int型,差值是两个指针之间相差了几个基类型,差值的正负可以判断两个指针的前后位置;` (2)*a++回导致编译报错,*p++可以,因为p是指针变量,但是a是指针常量;(1)在加法两端必须是一个是指针一个是常数,不可以两端都是指针;(2)常用于整型数组中;

2025-05-15 19:22:27 292

原创 C语言——宏定义

预处理:预处理命令就是在我们代码的最前面,写成# + 命令的这种形式的就是预处理命令,在进行正式的编译之前,对源文件进行一些文本方面的处理,比如文本替换、文件包含、删除部分代码等,这个过程就叫做预处理。1.正确灵活的运用指针,可以有效地表示复杂的数据结构,可以动态分配内存,方便地使用字符串,有效而方便地使用数组,再调用函数时能获得1个以上的结果。如果表达式的值为假,则不执行下面的程序。编译:把预处理之后的c代码(人类能看懂的)翻译成计算机能看懂的汇编语言,同时检查语法错误等,但此时还不能够直接执行。

2025-05-15 19:16:38 1727

原创 二维数组函数传递

有静态生存期为其包括全局变量、静态局部变量static int s_i(把s_i的空间由动态改为静态,在main函数第一条语句之前已经开好空间了,有静态生存期,但是有局部作用域);3)全局变量:为了实现函数的传参,但是通常不使用,使用后其函数要与定义的全局变量绑定在一起,耦合性不够且空间也浪费,尽量不使用;2)全局作用域:在任何花括号之外的变量,叫全局变量,生效范围是从定义开始,到本文件结束是结束(int g_i);1)auto(自动)变量:局部变量前,默认时auto,表示该变量的开辟、销毁是自动的;

2025-05-13 16:32:46 637

原创 函数递归,数组

2)当使用数组作为参数传递时,因为传递的总是地址,是指针传递,可以是下面被调函数修改主调函数,并且这样的传递方式,可以提高效率。2)同样因为传递的总是地址,是指针传递,可以是下面被调函数修改主调函数,并且这样的传递方式,可以提高效率。2)编写程序实现void itoa(char s[], int n);,原因是栈会很快堆满;递归调用会很占内存,一次递归需要一次空间分配,能用循环用循环;1)编写程序实现int atoi(char s[]),实现字符串转整型;1)要传递一个参数,数组名,可以省略传递数组长度;

2025-05-13 16:28:12 454

原创 C语言——函数

1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。返回值:函数的运行结果:返回值与函数类型不一致,将返回值转函数类型,实参与形参类型不一致,将实参转为形参类型,返回值不可是数组本身,可以返回地址;5).在C语言中,实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。1)栈区:系统自动分配、释放空间,用于存放地址、函数定义的变量、形参。函数类型:运行结果的类型,可以为任何类型,如不写默认int型;3)在被定义的函数中,必须指定形参的类型。

2025-04-28 09:03:23 234

原创 C语言——二维数组

数据类型 数组名[常量表达式] [常量表达式]列数:cols=sizeof(a[0])/sizeof(a[0][0])注意: 可以省略行,不能省略;(3)单一性:里面的元素数据类型都是单一的;行数:rows=sizeof(a)/sizeof(a[0])(2)有序性:存放元素的顺序是有序的;(1)格式:数组名[下标][下标]1.char 数组名[常量表达式][常量表达式];(1)连续性:存储空间是连续的;4.二维数组的初始化。

2025-04-28 09:00:22 242

原创 C语言——数组2

2)如果s1相对应位置元素比s2相对应位置元素的ASCII码大,返回一个正值;至少是strlen(s1)+strlen(s2)+1;2)与sizeof相比较,strlen是字符串中有效字符长度,sizeof是占的总内存的空间(包括“\0”)2)注意:目的数组空间一定要能存下源数组的至少strlen(s1)+1;’0‘:字符0,char,一个字节,ASCII的48。1)格式:strcpy(目标,源);‘\0’:空字符,一个字节,ascii的0。“0”:字符串,两个字节(还有个\0)

2025-04-27 18:14:00 533

原创 C语言——数组

求a[-1],此时会造成数组越界访问,会改掉其原有位置的数据。通过a[ ]进行赋值时,不可以给超过数组空间的其他量赋值。1.数组的定义方式:类型说明符 数组名 [常量表达式]注:数组可以被初始化,但不能被赋值。没有给定初值的元素,其初始化值为0。常量表达式用来表示元素的个数,即数组长度。单一性:每个元素类型一致,字节大小一致。3.冒泡排序:相邻两个元素两两比较,小的放前,大的放后。2.数组的引用:数组名 [下标]2.选择排序:合适的位置放合适的数。

2025-04-27 18:00:55 282

原创 C-循环结构

2.语句标号标识符表示,其命名规则与变量名相同,由字母、数字、下划线组成,开头不能是数字。3)while的循环体可能一次不执行,但是,do...while至少执行一次。0时,执行while里面的语句,先判断表达式,后执行语句。1)do...while是先执行循环体,然后判断循环条件。continue:循环短路语句,终止本次循环,不影响后续循环。1)格式:while(表达式)语句。1.break:循环短路语句,终止循环。表达式3:让循环体趋于结束的语句;1)循环变量初始化语句;表达式1:循环变量初始化语句;

2025-04-25 12:31:45 399

原创 【无标题】

如果是自左向右计算时,根据第一个的真假可直接判断出整个结果的真假,往后的直接截断,不用再进行判断,此时因为后续未进行判断,后面进行的各种计算不影响元素的值,此时元素的值由计算到的位置判断。如果if后面语句只有一行,可以省略{},但是,最好写上,并且左右花括号要独占一行;在进行与常量的比较时,常量写“==”的左边,变量写“==”右边;注意:else if后面需要加括号,括号内加条件,并且此条件不可和前面的条件相交;"&&"和"||"是自左向右;2.解释:表达式真,结果是表达式2;"大于"&&"大于"||"

2025-04-25 11:04:22 447

原创 C语言输入输出

m.nf: m表示这个总域宽(包括小数点),n表示小数点保留位数(四舍五入)%nd:以n位域宽打印,不足n位就拿空格补齐,若n太小不足位数,以实际打出;1)功能:从终端接受字符串并转换为对应的数据形式存放在内存中;格式:putchar(‘ ’)/putchar( )2)格式:printf(const char *,...);1)可以指定输入数据所占的列数,系统自动按它截取所需数据。格式:getchar();(1)putchar:向终端输出一个字符,(2)getchar:向终端接收一个字符。

2025-04-23 10:18:09 234

原创 【无标题】

(2)符号位扩展:short-->long:把shout放在int的低位中,其他位置如果short是正数,就补0,如果short是负数,就补1;在右侧操作数为0时,编辑器不会报错,但是运行程序会崩溃,且后面的语句不再执行。i:只读变量,只可被初始化,不可赋值,但是依旧是变量,是左值。2.与赋值不一样,在变量生存期内,赋值可以多次进行,但是初始化只能进行一次。(1)赋值是内存空间的拷贝,若空间一样,可以直接拷贝;(3)高位截断:大空间放小空间,直接截断高位,取低位;1)++i:先加再用,没有开辟临时变量,

2025-04-23 09:26:51 390

原创 C语言基础

3.小端存储:字节或半字节的最低位字节(Least Significant Bit,LSB)存放于内存最低位字节地址上。(3)十六进制:形式:0x****,与二进制转换是四位二进制数表示以为16进制数。(1)八进制:形式:0***,与二进制转换是三位二进制表示一位八进制数。此时,数值0.9是double类型,比float类型的精度大,结果为no。1.用‘ ’引起来的可以存放字符,其数据类型表示:char ,内存大小占一个字节。在‘ ’内只能放一个字符,若‘ ’内放了多个字符,按最后一个算。

2025-04-17 18:27:16 330

原创 Linux基础

ls -l 查看当前目录下的文件详细信息。

2025-04-17 13:52:47 503

空空如也

空空如也

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

TA关注的人

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