- 博客(35)
- 收藏
- 关注
原创 9.4双向链表
内存泄漏是一个常见的问题,尤其在长时间运行的程序中更为突出,因为它会导致系统资源的逐渐耗尽。3. 循环引用:两个或多个对象相互引用,形成一个循环链表,如果这些对象没有被其他部分访问,但它们之间存在引用,那么它们的引用计数永远不会为零,导致内存泄漏。• 频繁的垃圾回收:为了清理不再使用的对象,垃圾回收器会频繁运行,导致程序暂停(Stop-The-World,STW)次数增加,用户体验变差。• 程序性能下降:随着内存泄漏的积累,程序可用的内存逐渐减少,导致程序运行速度变慢。
2024-09-04 20:58:40
352
原创 8.29数据结构
函数原型 int sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */);create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
2024-08-29 22:37:24
649
原创 8.28io多路复用
当有文件描述符就绪时,select函数会返回,并告知哪些文件描述符已经准备好进行读取或写入操作,将其对应下标置1,然后应用程序可以通过遍历文件描述符集合来处理就绪的IO事件。在传统的阻塞IO模型中,每个IO操作都需要一个独立的线程来处理,当有大量的IO操作时,会导致线程数量的增加,从而带来线程切换和上下文切换的开销。文件操作:在文件操作中,当需要同时读取或写入多个文件时,可以使用IO多路复用来监听文件描述符的可读或可写事件,从而避免使用多线程或多进程的方式,提高文件操作的效率。
2024-08-28 21:19:24
910
原创 8.27tcp
异步通知的io方式,节省cpu | 只能监测少量io,以轮询的方式可监测多量io。多进程:每个进程有自己的内存空间和资源,进程间通信(IPC)通常复杂且开销较大。多线程:适用于需要共享数据和资源的任务,如计算密集型的应用和需要快速响应的应用。多线程:线程之间较为紧密,一个线程的崩溃可能会影响整个进程中的其他线程。多进程:进程创建和销毁的开销较大,因为需要分配和管理独立的内存空间。多线程:线程创建和销毁的开销较小,因为它们共享进程的内存和资源。多进程:进程间相对独立,一个进程的崩溃不会直接影响到其他进程。
2024-08-27 21:36:29
195
原创 8.23tcp
面向字节流特点,会造成可能数据与数据发送到一块,成为粘包,数据之间不区分。在底层下面,socket 会在发送数据会等一下,时间到了就一次性发送。因为缓冲区的大小,一次性发送的数据会进行拆分(大小不符合的时候)字节流就是像水一样,一个接着一个往过流,字节流,紧挨着,根据端口过滤:tcp.srcportXX;1.规定一些数据与数据之间的间隔符。# 查看 telnet服务是否开启。2.可以指定要发送的数据的长度。导致,可能多次的数据粘到一起。数据与数据之间没有边界感。3.自己将数据包打包。如果与的关系:and。
2024-08-23 21:53:42
259
原创 8.22tcp
将套接字( sockfd )变成被动的连接监听套接字(被动等待客户端的连接),至于参数 backlog 的作用是设置内核中连接队列的长度(这个长度有什么用,后面做详细的解释),TCP 三次握手也不是由这个函数完成,listen()的作用仅仅告诉内核一些信息。对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三次握手,而这个连接的过程是由内核完成,不是这个函数完成的,这个函数的作用仅仅是通知 Linux 内核,让 Linux 内核自动完成 TCP 三次握手连接。
2024-08-22 22:33:59
765
原创 8.21网络通信
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)b/s browser server 浏览器,服务器模型 ---通用的客户端。//server --- 服务器端 --- 角色 --- 被动的角色。//client --- 客户端 --- 角色 --- 主动的角色。1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)物理层面数据的传输 --- 一位的二进制数据 //比特流。
2024-08-21 21:55:02
803
原创 8.16浪费两个小时
P操作:使用这个资源(个数减1)。尝试获取资源;有则用,无则等。V操作:产生这个资源(个数加1)。释放一个资源;如果有任务则等,无任务则用。1、公共资源角色buf[1024]公共资源。(1)写线程——写资源可写数据条件:①开始,有空buf;②读线程,读完了。p(写资源) //申请资源V(读资源)//产生资源(2)读线程——读资源开始,buf中无数据可读,此时充当写资源。可读数据条件:写线程结束。P(读资源)V(写资源)2、信号量机制本质:锁(可顺序操作的一把锁);
2024-08-16 20:54:38
510
原创 8.14 进程end线程begin
1.wait 和 waitpid都是 等待子进程状态改变2.wait是一种阻塞调用3.waitpid 可以实现非阻塞调用#if 0int main()return 1;int i;}*/if(WIFSIGNALED(i)) //异常结束//正常结束while(1)sleep(1);//正常结束// }return 0;
2024-08-14 21:37:30
820
原创 8.13 进程细化
父进程创建出子进程之后,子进程做的事情与父进程完全不同(自力更生)... --- 要执行的文件本身需要用到的参数(都是字符串形式)3._exit(系统调用)path --- 表示要运行的文件的路径(要包含文件名)1.任务:子进程做的事情和父进程差不多(子承父业)p ---path //PATH(可执行文件路径)arg --- 要执行的文件的名字。v --- vector(向量)e ---表示该函数的环境变量。
2024-08-13 22:01:03
322
原创 8.8 关于ll
默认的情况下,make 命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件。有另外一些 make 只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的 make 都支持“makefile”和“Makefile”这两种默认文件名。参数:target:被链接向的文件的路径 linkpath:新符号链接文件。参数:oldpath:要链接向的文件newpath:创建的新硬链接文件。返回值:成功返回1970年到现在的秒数(长整型);
2024-08-08 22:23:16
889
原创 8.7文件io目录
使用readdir()函数,传入目录流指针作为参数,成功时返回一个指向dirent结构体的指针,该结构体包含了文件的信息(如文件名)。参数:pathname(const char *)- 要创建的目录的路径,mode(mode_t)- 目录的权限。参数:path(const char *)- 文件或目录的路径,buf(struct stat *)- 用于存储状态信息的结构体。使用opendir()函数,传入目录名作为参数,成功时返回一个DIR*类型的目录流指针,失败时返回NULL。
2024-08-07 21:10:42
294
原创 8.6标准io 文件io
如果值为整数,则文件末尾偏移。如果值为负数,则文件开头偏移。offset 要在文件内偏移的距离, 单位字节。4.fflush刷新 fflush(stdout);whence偏移起始位置,由系统定义的三个宏开始。3.fflush来刷新 fflush(fp);一个基于Linux内核的没有缓存的IO机制。内核每打开一个文件就会获得一个文件 描述符。注:不支持设备文件, 一般用于普通文件。SEEK_SET 文件的开头位置。SEEK_CUR 文件的当前位置。SEEK_END 文件的末尾位置。
2024-08-06 20:33:12
350
原创 8.5文件io
功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应 的本地内存(栈区数组,堆区内存)功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr所在 的本地内存中。nmemb 要获取的数据块的个数,拷贝的数据块个数。功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件流对象。
2024-08-05 22:13:30
503
原创 8.3高编
d为目录 L软链接 -p管道文件(不同进程共享设备)-s 网络文件(套接字文件/设备)b块设备。1.if 可以比较目录 一般文件类型 字符串 表达式中,结果为0时为真。2.``为反单引号 中间写命令,直接执行,结果给一个变量 ,并保存。-为普通文件(文本文件,可执行文件,数据类) c字符设备。打印字符串,遇到$变量则打印变量中的值。打印字符串,遇到$变量依然打印$变量。命令行可以写参数,随参数传入,默认为字符串。把一个命令写在一个脚本,与C语言有区别。* 通配符,写不加$,读加$
2024-08-04 16:02:30
422
原创 8.2数据类型位运算
是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。(5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体变量这种用法相仿)。即010=0,0|1=1,110=1,1l1=1。(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。它们不是变量,不能对它们赋值。(2)枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,(3)共用体变量的地址和它的各成员的地址都是同一地址。
2024-08-02 21:03:02
324
原创 8.1结构体+链表
为了使用方便和使之直观,可以把(*p).num改用p->num来代替,它表示p所指向的结构体变量中的num成员。4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2024-08-01 19:21:00
319
原创 7.31 指针用法
例题:比较的是p1,p2的地址,输出结果为yes ,处于字符串常量区,相同字符串只存一个指针数组,8个野指针, 80bit数组指针,指向数组的指针,指向整个数组,上式只能指向长度为10的一维整型数组, 是连续的40字节的首地址,8bit引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。向后偏移 n *sizeof基类型。
2024-07-31 20:55:58
238
原创 7.30字符数组指针
迭代逆序1. 首先获取数组的第一个值(作为基准)2. 遍历当前数组,从第二个值开始,比基准元素小的放到左侧数组,比基准元素大的放到右侧数组。3. 分别对左侧和右侧数组进行快速排序(递归)4. 直到当前进行快排的数组长度为 15. 开始合并,返回排列好的数组6. 完成排序二分查找(两个指针间不可以+*/,所以计算mid地址时,需要用到减法)
2024-07-30 21:59:14
137
原创 7.29指针
7.int i=1,char *p = (char *)&i ,if *p == 1,则为小端排序方式。int *p: *为类型标识符 (指针变量p指向i) 可以希望使用指针变量p来访问i。i= 100(直接访问) *p= 100(间接访问)2.一般形式:基类型 *指针变量名 (基类型指所能装地址的数据类型)6.指针类型强制转换:char *p = (char *)&i。8.对指针可以进行加法计算,结果与基类型有关。p为变量可以进行++计算,但a为常量不能++计算。
2024-07-29 21:03:19
350
原创 7.27 宏定义 标识符
外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。不在任何花括号为全局作用域(定义的变量为全局变量)全局变量可以为本文件中其他函数所共用。在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。4..在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)
2024-07-28 15:02:13
479
原创 7.26 二维数组封装
二维数组作为函数参数传递时,传递为函数的首元素地址,即第一行16个字节的首地址,无法计算出行数,可以计算出列数,所以需要通过函数参数传递行数,必须准确规定函数的列数。数组传递的为a[0]的地址,即指针传参,所以可以在被调函数中修改主函数的值(数组传参不是拷贝数组,而是传递数组首元素地址,传递效率高于值传递)将数组作为函数参数传递,并没有将a的所有元素传过来,只是把a的首元素地址传过来(为了高效)函数中sizeof(a[ ]/s[ ])= 8(64位),即为首元素地址。sizeof偷换概念。
2024-07-26 20:36:23
207
原创 7.25 函数
c语言中,所有传参都为值传递,被调函数中,无法通过形参改变实参的地址,即无法在被调函数中修改主调函数。调用函数前,保护现场 ==》调用结束后, 恢复现场(消耗栈区空间)循环的第五种表达形式,(无条件)导致栈区空间消耗殆尽造成程序崩溃。int ret 为函数的入口地址,pc指向入口地址。传参过程中,不允许对同一变量进行++,--的操作。堆区(向操作系统申请,用完归还,手动申请和销毁)只把 i 的值传过来,并不会影响 i 的值。如上,想改变i,需要fn(&i)栈区(定义指针标量,指向堆区)单片机尽量不用递归;
2024-07-25 22:47:50
282
原创 7.24 二维数组
如 int a[ ] [4] = {1,2,3,4,5,6,7,8,9,10,11,12}3.函数执行return语句之后,会立即停止运行当前函数,return语句之后的将不会执行,返回到调用参数的位置,继续向后执行代码。对二维数组取首地址时,可以取a的首元素地址,也可为a[0]或a[0][0],代表的均是同一个地址。int cols(列) = sizeof(a[0]) / sizeof (a[0]a[0]);它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。
2024-07-24 22:03:57
319
原创 7.23。。。。。。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'0')。3.通常用一个字符数组来存放一个字符串,字符串总是以’/0’作为串的结束符,因此当把一个字符串存入一个数组时,也把结束符‘/0’存入数组,并以此作为该字符串结束的标志。所以我们在定义字符数组时给的长度要足够大(>len),否则很容易出现越界访问的情况。用来存放字符数据的数组为字符数组,字符数组中的一个元素存放一个字符。1.如果在定义字符数组时不进行初始化,则数组中各元素的值是随机数的。
2024-07-23 21:22:28
184
原创 7.22.......
选择排序:通过每次找到最小(或最大)的元素,并将其放到已排序序列的起始位置,然后从剩余未排序的元素中继续寻找最小(或最大)元素,重复此过程直到所有元素都被排序。定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值后5个元素值为 0。(1)在定义数组时对数组元素赋予初值。例如:int a[10]={0,1,2,3,4,5,6,7,8,9};(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
2024-07-23 12:54:39
302
原创 7.20‘’‘’‘’‘’
先对表达式1求值,只做一次,再求解表达式2,若其值为真(值为非0),则执行 for语句中指定的内嵌语句,然后执行表达式3。先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。注意:不要在for后加分号(),若加分号,循环正常结束时,结果为初次循环结束使条件为假的值。用于for循环时,为循环断语句,终止当前循环,跳出循环时,后面的代码不执行,为循环断路。
2024-07-20 23:45:54
291
原创 7.19.......
5<-4<-3 会变成 1<*3 变成 0。编译器判断&&前面表达式为假时,就不再判断后面表达式,叫做表达式截断(只有与或里面有)。c语言中关系表达式的结果是int型,占4字节且非0即为真。default 后面不要break仅限于在最后面。switch(c)c必须为整形或与整形兼容。语句1到语句n中最后只会执行一个语句。if嵌套尽量不超过五层,不然太乱。1、关系运算符及关系表达式。2、逻辑运算符及逻辑表达式。k = 假 && 真/假。case + 常量表达数。5、switch语句。
2024-07-19 21:35:40
201
原创 7.18...........
putchar(‘c’),输出字符变量c的值,c也可以是整型变量(输出结果为ASCII码对应的字符)。缓冲区,由于cpu与外设速度不匹配,对数据建立的临时的内存空间,等待数据收集完毕cpu再取出数据。“%m.nf”:m为输出占用的宽数,输出长度小于m,在前面补空格。一个源文件由若干个函数和预处理命令以及数据声明组成,一个函数由数据声明部分和执行语句组成。c语句组成:控制语句(if)、输出函数(printf)、表达式语句(表达式+分号)、空语句(;1、printf函数:可以输出多个数据,且可以是任意类型。
2024-07-18 21:12:42
176
原创 7.17.......
由于unsigned级别高于int,所以先将i的类型转换为 unsigned,因unsigned 均>0,所以输出结果将为 No。3. short= int (长数据类型向短数据类型赋值时 去掉高位字节位 保留地位字节位)为高位截断。long int (返回类型)random(函数名)(标识符)(void)虚空的:(形参)如下:i=2时,进行i++操作,程序将先拷贝i的值存储在另外一个地址,后对i进行+1操作。编译器只做类型检查,若除数为0,编译器无法检测,将编译成功,后程序崩溃。
2024-07-18 13:01:50
236
原创 7.16...........
只能是字母 数字 下划线 ,第一个必须为字母或下划线 (关键字 不可做标识符 int void)( 不使用二类字 不可定义同名 要区分大小写)符号常量(大写)字符类型:整型 ( 整数) 字符型( 字符)浮点 (小数)指针 (地址)有符号整型 (signed) 范围:-2^31 ——2^31-1。打印ascll码对应字符 单引号(字符型) 双引号(字符串)float 4字节(单精度)8字节 Double(双精度)CPU中央处理器(计算)RAM随机访问存储器(存放数据)
2024-07-18 12:56:01
251
原创 7.15.........
含义:根目录下的home目录下的linux目录下的Desktop路径。11. 家目录(~):每个用户都有自己的一个家目录,用户在家目录下有操作权限。10. 根目录(/):Linux操作系统最顶层的目录,用户没有操作权限。白色文件:普通文件(相当于Windows上的文本文档)蓝色文件:目录文件(相当于Windows上的文件夹)功能:查看当前路径下的所有文件(包括以.的隐藏文件)使用cd 切换时,一定要注意切换的目录的位置是否在当前路径下。功能: 创建目录文件(文件夹)功能:查看当前路径下的文件。
2024-07-18 12:50:29
160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人