- 博客(35)
- 收藏
- 关注
原创 数据结构2 :双向链表和内核链表
1.双向链表是一种链表数据结构,其中每个节点包含三个部分:一个数据域(存储节点的数据)、一个前驱指针(指向列表中的前一个节点)和一个后继指针(指向列表中的下一个节点)。2. 方便插入和删除:在双向链表中插入或删除一个节点只需要修改相邻节点的前后指针,而不需要遍历整个链表来查找前驱或后继节点。2. 内存管理:内核链表的节点需要从内核的内存池中分配和回收,因此需要考虑内存碎片和内存使用效率等问题。稍微复杂的操作:相对于单向链表,双向链表的操作逻辑稍微复杂一些,需要同时更新前后指针。双向链表的删除和销毁。
2024-09-06 20:40:48
869
原创 数据结构(1)
程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中, 并在此基础上实现某个特定的功能的操作;线性结构:元素之间一对一的关系(表(数组,链表),队列。散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对。一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)容易造成存储空间碎片。图形结构:元素之间多对多的关系(网状结构)树型结构:元素之间一对多的关系(二叉树)数据的物理结构:数据的逻辑结构在计算机内存中的存储形式。数据的逻辑结构:数据元素与元素之间的关系。
2024-09-06 19:52:34
517
原创 linux系统编程:数据库
create table 表名(列名1 数据类型 ,列名2 数据类型, 类名3 数据类型);insert into 表名 values(值1, 值2, 值3);column_value: 查找到的一行数据的每一列值的地址的集合。文件----------------------》硬盘:程序运行结束、掉电数据不丢失。arg:当执行select语句时,使用到,传递给回调函数的第一个参数。column_name:查找到的一行数据的每一列列名的地址的集合。外连接 LEFT OUTER JOIN。
2024-08-29 21:33:57
2082
原创 linux系统编程:io的多路复用
2. 添加文件描述符到集合中 void FD_SET(int fd, fd_set *set);EPOLL_CTL_ADD: 向集合中添加文件描述符。nfds : 关注的文件描述符中的最大值+1。EPOLL_CTL_DEL :删除文件描述符。readfds:关注的读事件的文件描述符集合。writefds:关注的写事件的文件描述符结合。4. 根据返回的结果做对应的操作(对io读、写操作)4. 根据返回的结果做对应的操作(对io读、写操作)4. 根据返回的结果做对应的操作(对io读、写操作)
2024-08-29 21:23:33
974
原创 linux系统编程:网络通信
MTU限制 //每个网络都有一个最大传输单元(MTU),定义了该网络上可以传输的最大数据包大小。当数据包的大小超过下一跳网络的MTU时,路由器会将这个数据包拆分成多个较小的数据包。每个分包都会包含原始数据包的部分数据以及必要的头部信息。1.粘包 tcp特点 面向连接 字节流(TCP 将数据视为连续的字节流,没有明确的消息边界。特殊分隔符:在消息间加入特殊的分隔符(如换行符或其他特殊字符),接收方根据分隔符来区分消息。拆包通常指的是将较大的数据包拆分成较小的数据段或分包,以便在网络上传输。
2024-08-23 21:29:58
495
原创 linux系统编程
IP //用来标识网络中的一台主句 ---- 通过ip可以找到对应一台主机。高效性、同步机制、内存映射、系统资源、跨进程访问、内存管理、灵活性、安全性。shmctl() // 修改共享内存属性,也可以删除指定的共享内存对象。socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)accept //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据。shmat() //将指定shmid对应的共享内存映射到本地内存。
2024-08-22 20:44:08
1152
原创 Linux系统编程:线程 (3)
pipefd //用来获取 管道的两端 //读端pipefd[0]信号量 //交通信号灯 //实现一种可以让线程间有序访问临界资源的方式。注意:sem 申请资源后会自动执行 sem = sem - 1;如果sem没有资源(==0),则线程阻塞等待,一旦有资源。如果sem有资源(==1),则申请该资源,程序继续运行。可以读管道,但是管道中如果没有数据了,此时读操作 不阻塞。可以读管道,但是管道中如果没有数据了,此时读操作 阻塞。1.信号量 --- 来描述 可使用的资源的个数。
2024-08-16 21:06:12
980
原创 linux系统编程:线程(2)
缺点: 进程间共享数据不方便 //进程间通信(管道,信号,共享内存)缺点: 安全性不好 //专门的技术 解决资源竞争:---互斥同步。可分离性 -----pthread_detach //子程序执行任务较长,主线程也不需要关心子线程状态。可结合性 -----pthread_join //这种用于线程任务较短,主线程需要关心子线程状态。互斥 --- 要么不访问,要访问就是一次完整操作(原子操作)定义互斥锁 ==》初始化锁==》加锁==》解锁==》销毁。
2024-08-15 20:28:18
705
原创 linux系统编程:线程(1)
注:1.pthread exit 本身表示结束线程,如果用在main函数中, 表示结束主线程,主线程结束 并不表示进程结束,此时,主线程执行流结束,进程会在其余线程都结束后结束。注:线程回调函数 -- 完成线程任务功能的函数 ,需要调用者,自己实现。//指向指针函数的函数指针。3.waitpid可以实现非阻塞调用 ---- 调用进程,逻辑一般不受影响。@retval ----用来保存,退出状态值所在空间的地址。2.wait是一种阻塞调用 --- 调用进程,一般不做额外的事情。
2024-08-14 19:27:13
1089
原创 linux系统编程:进程(2)
eg :"ls -l /"中 要执行1s 但是 ls 需要用到 "-l" 和 " /"1.任务--- 子进程做的事情 和 父进程 差不多多任务 //子承父业。参数 path 要包含文件名) ---表示要运行的 文件的路径。_exit 系统函数 -------系统调用不会刷新缓冲区 进程立即结束。参数 arg -----要执行的 文件的名字。淘宝服务器----程序---创建子进程。exit 库函数 ---- 刷新缓冲区。
2024-08-13 21:55:38
582
原创 linux系统编程:多任务编程(进程1)
僵尸进程本身并不占用任何资源,但它仍然存在于进程表中,占用一个进程表条目,直到其父进程通过 wait() 或 waitpid() 系统调用来回收它为止。父进程先于子进程结束:如果父进程在子进程结束之前就已经结束,那么子进程就会变成孤儿进程,并被 init 进程(PID 1)收养。父进程没有调用 wait() 或 waitpid():如果父进程创建了子进程,但在子进程结束之前没有调用 wait() 或 waitpid() 来回收子进程的状态信息,那么子进程就会变成僵尸进程。4.父子进程运行的顺序,不确定。
2024-08-12 21:18:07
784
原创 gdb 测试
你可以为断点设置条件,只有当条件满足时才会停止程序。这对于调试某些特定情况非常有用。监视点允许你在变量值改变时停止程序。这对于调试数据竞争等问题非常有用。3)bfun.c:36 设置断点,运行到这个位置,程序自动暂停。GDB 提供了查看当前函数调用栈的功能,这有助于理解程序的执行路径。2)gdb a.out 调试可执行文件。1),gcc -g*c加上调试选项-g。5)where 找出段错误的位置。3)按r(mun)直接开始运行。6)使用p命令,查看变量或指针等数据。gdb 的常规使用步骤:找段错误。
2024-08-10 15:59:47
228
原创 linux系统编程:(4)
akefile 包含以下几部分:1. 目标(Targets):最终要构建的产品。2. 依赖项(Dependencies):构建目标所需的源文件和其他目标。3. 命令(Commands):用于构建目标的命令序列。•make TARGET=my_app: 构建名为 my_app 的目标。创建一个链接向oldpath文件的新符号链接文件。oldpath:被链接向的文件的路径。newpath:创建的新硬链接文件。6.makefile 工程管理工具。pathname:删除文件的路径。
2024-08-08 20:49:39
2071
原创 linux系统编程:标准io(3)
从目录流中读取文件信息并将保存信息的结构体。功能:关闭之前已经打开的目录流对象。参数:opendir的返回结果中目录流对象。出错或者读到目录流末尾返回NULL。成功返回包含路径空间的字符串首地址。获得一个文件流指针中的文件描述符。buf:保存工作路径空间的首地址。pathname:目录文件的名字。buf: 属性存放空间的首地址。打开一个目录获得一个目录流指针。将文件描述符转化为文件流指针。size:保存路径空间的长度。fd:已经打开的文件描述符。改变当前程序的工作路径。path:改变到的路径。
2024-08-07 21:20:16
383
原创 linux系统编程:标准io(2)
ftell 主要用于获取文件流中当前的文件位置指示器的位置。如果成功,ftell 返回文件位置指示器的当前位置,即从文件开头开始的字节数。•如果发生错误,返回 -1L。如果文件指针已经达到文件末尾,feof 返回非零值(通常是 1),如果文件指针还没有达到文件末尾,feof 返回 0。O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。行缓冲,1k, terminal,主要用于人机交互stdout。whence 偏移的起始位置,由系统定义的三个宏开始。
2024-08-06 21:21:33
2176
原创 linux系统编程:标准IO
•"w": 以写入方式打开文件,如果文件不存在则创建。返回值是一个指向 FILE 结构体的指针,如果成功打开文件,则返回指向该文件的指针;•如果到达文件末尾(EOF)或读取过程中发生错误,返回 NULL.如果成功写入字符串,fputs 返回非负值。eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。
2024-08-05 21:54:54
542
原创 Linux系统编程基础知识
Bash 提供了强大的脚本语言支持,使得用户能够创建复杂的自动化脚本。当请求系统运行一个未指定完整路径的程序时,系统会在 PATH 环境变量指定的路径中查找该程序。命令在进行赋值的时候,两边不能有空格,进行计算的时候,expr命令是告诉系统是express表达式,然后字符串转为int,进行计算·,而在expr后面计算的时候,表达式两边要加空格。Shell 脚本是用 Shell 编程语言编写的脚本文件,这种语言允许用户通过编写一系列命令来实现自动化的任务处理。* 相当于switch语句的default,;
2024-08-04 23:03:27
339
原创 c语言:共用体和位运算
(3)当不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型数据)时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。(4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。(5)可以把共用体变量作为函数参数,也可以使函数带回共用体变量,而且可以使用指向共用体变量的指针。(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
2024-08-02 21:21:00
336
原创 c语言:结构体与共用体
struct 是声明结构体类型时所必须使用的关键字,不能省略),它向编译系统声明这是一个“结构体类型”,它包括 num、name、sex、age、score、addr等不同类型的数据项。如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
2024-08-01 19:54:33
467
原创 c语言基础:指针(3)
表示定义一个指向函数的指针变量p,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。(5)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括号中根据需要写上实参。实参是和命令一起给出的,也就是在一个命令行中包括命令名和需要传给 main函数的参数。(6)对指向函数的指针变量,像p+n、p++、P--等运算是无意义的。一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为函数的指针。main函数可以这样写。
2024-07-31 20:11:07
266
原创 c语言基础:指针(2)
将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用指向字符的指针变量作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。返回值为指针的函数,不能返回局部变量的地址,可以返回全局变量或static局部变量的地址。其申请的字节一定是连续的,这个函数返回的是其所申请空间字节的首地址。
2024-07-30 23:18:11
157
原创 c语言基础:指针(1)
需要说明的是:C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。其中p和(p+1) 相差的是的1个sizeof(基类型)。注: (1)指针变量前面的“*”表示该变量的类型为指针型变量。(2)*:指针运算符(或称“间接访问”运算符),取其指向的内容。
2024-07-29 19:16:06
146
原创 c语言基础(4)
不同的系统允许使用的寄存器个数是不同的,而且对register 变量的处理方法也是不同的,有的系统对register变量当作自动变量处理,分配内存单元,并不真正把它们存放在寄存器中,有的系统只允许将int、char和指针型变量定义为寄存器变量。在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数。这称为“局部变量”。说明:(1)主函数中定义的变量(m,n)也只在主丽数中有效,而不因为在主函数中定义而在整个文件或程序中有效,主函数也不能使用其伦函数中定义的变量。
2024-07-29 00:57:03
564
原创 c语言:函数(3)
3)在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。5)最后应当强调说明一点:用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组就共占同一段内存单元。由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,是单向传递,即“值传送”方式。1.数组元素作函数实参。1.数组作为函数参数。
2024-07-26 20:35:19
146
原创 c语言:函数(2)
在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”),在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。注: 在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。3)在被定义的函数中,必须指定形参的类型。
2024-07-25 21:01:39
487
原创 c语言:数组 和 函数
(3)C程序的执行是从main函数开始的,如是在main函数中调用其他函数,在调用后流程返回到 main 函数,在main 函数中结束整个程序的运行。(4)所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的,函数间可以互相调用,但不能调用 main函数。main函数是系统调用的。例如: int a[3][4]-{{1,2,3,4),(5,6,7,8),(9,10,11,12)};C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
2024-07-24 21:23:24
294
原创 c语言:数组(2)
(3)如果在复制前未对str1数组赋值,则str1各字节中的内容是无法预知的,复制时将str2中的字符串和其后的"0’一起复制到字符数组1中,取代字符数组1中的前面6个字符,最后4个字符并不一定是斜杠零,而是str1中原有的最后4个字节的内容。在C语言中,是将字符串作为字符数组来处理的,字符串中的字符是逐个存放到数组元素中的,这个字符串的实际长度与数组长度相等,C语言规定了一个“字符串结束标志”,以字符'\0'作为标志。作用是将str2中最前面2个字符复制到str1中,取代strl中原有的最前面2个字符。
2024-07-23 20:11:12
679
原创 c语言中的数组(1)
(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度,但若数组长度与提供初值的个数不相同,则数组长度不能省略。注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”的区别,(3)常量表达式中可以包括常量和符号常量,不能包含变量,即数组的大小不依赖于程序运行过程中变量的值。(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。如:int a[5] = {1,2,3,4,5};连续性:数组的地址之间没有间隔。
2024-07-23 12:51:50
431
原创 c语言中的循环控制
while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i十十,或i-i+1等)。while 循环和 for 循环,可以用 break语句跳出循环,用 continue语句结束本次循环(break语句和continue语句见6.8节)。(7)表达式一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。称为循环的执行条件;++i,称为是循环趋于结束的语句。
2024-07-20 18:40:48
666
原创 选择结构程序设计
表达式2 :表达式3 如果表达式1为真,则表达式2的值作为整个条件表达式的值,如果表达式1为假 ,则表达式3的值作为整个条件表达式的值.当表达式的值与某一个case后面的常量表达式的值相等时,就执行此 case 后面的语句,若所有的case 中的常量表达式的值都没有与表达式的值匹配的,就执行 default后面的语句。用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。
2024-07-19 21:24:09
726
原创 c语言中数据的输入输出
f :用来输出实数(包括单、双精度),以小数形式输出,不指定字段宽度,由系统自动指定,使整数部分全部输出,并输出6位小数应当注意,在输出的数字中并非全部数字都是有效数字。注:一个整数,只要它的值在0~255范围内,也可以用“%c”使之按字符形式输出,在输出前,系统会将该整数作为ASCII码转换成相应的字符;%g : 用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
2024-07-18 19:19:51
801
原创 c语言中运算符与表达式
如果已定义x为 float型,进行强制类型运算后得到一个int 型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float 型)。如果短整型数据为正,则在整型的高位补0,如果短整型数据为负,则在整型的高位补F./ :除法运算符 ,需要说明,两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。求余表达式的结果的符号与左操作数的的符号有关,与右操作数的符号无关。整个逗号表达式的值是表达式2的值。需要说明的是,在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。
2024-07-17 19:28:01
548
原创 c语言的基本知识
数据在内存中是以十六进制数进行存储的,如果是正的十进制数,先转换成二进制数,再转换成十六进制进行存储,如果是负的十进制数,先求绝对值,将该数的绝对值的二进制形式,按位取反再加一,求出补码,再转换成十六进制数进行存储。字符型变量的存储:将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。2 、 变量:变量代表内存中具有特定属性的一个存储单元,它用来存放数据,也就是变量的值,在程序运行期间,这些值是可以被改变的。
2024-07-16 18:38:45
925
原创 Linux的基本操作命令
cp 源文件 目标文件 -r (文件夹)可以有多个,也可以一个都没有,名字没有限制。cd .. 进入当前目录的上一级目录。相对路径:不包含有根目录信息的目录表示方法。cp 源文件 目标文件(普通文件)功能:移动文件或目录;查看当前目录下的所有文件(包含隐藏文件)绝对路径:包含有根目录信息的目录表示方法。rm 目标文件 (目录文件)编译代码main.c默认生成a.out。rm 目标文件 (普通文件)在当前目录下创建一个新的目录文件。.. :当前目录的上一级目录。
2024-07-15 19:04:03
257
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人