自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内核链表

内核链表通常由链表节点组成,每个节点包含两个指针,分别指向前一个节点和后一个节点。

2024-09-05 21:08:17 272

原创 双向链表

双向链表:适用于需要双向遍历和快速反向查找的场景,比如浏览器的前进后退功能、文本编辑器中的撤销重做功能等。单向链表:适用于只需要单向遍历的场景,比如栈、队列等数据结构的实现。同样由多个节点构成,每个节点除了有数据域之外,还有两个指针域,分别指向直接前驱节点和直接后继节点。可以在两个方向上进行遍历,既可以从链表的头节点向尾节点遍历,也可以从尾节点向头节点遍历。只能沿着一个方向遍历链表,从链表的头节点开始,依次访问每个节点,直到尾节点。双向链表:每个节点需要两个指针域,占用的内存空间比单向链表多。

2024-09-04 21:09:02 269

原创 数据结构

程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)线性结构:元素之间一对一的关系(表(数组,链表),队列。散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对。数据的物理结构:数据的逻辑结构在计算机内存中的存储形式。数据的逻辑结构:数据元素与元素之间的关系。图形结构:元素之间多对多的关系(网状结构)树型结构:元素之间一对多的关系(二叉树)链式存储:采用一组非连续的内存空间保存元素。

2024-09-03 22:13:15 304

原创 网络通信粘包问题

抓包,即捕获网络数据包。当数据在网络中传输时,抓包工具可以拦截并记录这些数据包,以便后续分析。抓包工具可以捕获各种类型的网络数据包,包括 TCP、UDP、IP 等协议的数据包。原因:tcp 流式套接字,数据和数据之间没有边界,可能会导致多次的数据粘到一起。1、规定一些数据与数据之间的间隔符 “\aa”, "\r\n";常用抓包工具:wireshark、tcpdump。2、可以指定要发送的数据长度。3、调整接收方缓冲区大小。4,、自己将数据打包。

2024-08-23 20:05:30 330

原创 基于tcp c/s的网络通信

TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数。功能:接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据。的文件描述符文件与参数2 指定的接口地址关联,参数1所在的描述符中取出并从参数2所在的接口。据无误、数据无丢失、数据无失序、数据无重复到达的通信)如果是客户端,则该函数可以省略,由默认。功能:该函数固定有客户端使用,表示从当前主机向目标。如果该函数在客户端调用,则表示要将数据从。功能:如果该函数在服务器端调用,则表示将参数1相关。用于从该接口接受数据。

2024-08-22 20:42:26 634

原创 20240821

const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )domain 地址族,PF_INET == AF_INET ==>互联网程序。socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)//domain --域 (范围) ---socket 用于什么范围的通信。//SOCK_RAW 原始套接字 ===》IP。物理层面数据的传输 --- 一位一位二进制数据 //比特流。

2024-08-21 18:43:21 402

原创 DAY28

handler 要对这个信号做处理|是一个指向信号处理函数的指针。成功表示上一次设置的信号处理函数的入口地址, 失败 SIG_ERR。不能被阻塞、处理和忽略 SIGKILL SIGSTOP。SIG_IGN 忽略 SIG_DEL默认操作。信号是一种异步的通信方式 说明对象一定是两个。管道文件都不支持定位操作(lseek、fseek)信号被称为软中断(软件层面对中断过程一种模型)signum 要处理的信号编号。信号处理函数的注册函数。1、是一种特殊的文件。

2024-08-17 20:54:48 120

原创 DAY27

3. 信号量的PV操作 (核心) sem_wait()/ sem_post() ---生产者 消费者 模型。共享内存(*) //最高效 (5)信号量集() //信号量 (6)@pipefd //用来获取 管道的两端 //读端pipefd[0]1. 信号量的定义 sem_t sem //造了一类资源。如果sem没有资源(==0),则线程阻塞等待,一旦有资源。如果sem有资源(==1),则申请该资源,程序继续运行。

2024-08-16 19:32:20 336

原创 DAY26

1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。2.pthread_detach //可分离属性 ---子线程运行很久才结束 --- 设置分离属性。加锁 //加锁 加在 要访问临界资源的地方。//销毁一把锁 初始化锁。定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁。//实现一种可以让线程间有序访问临界资源的方式。

2024-08-15 19:46:37 301

原创 DAY25

(可结合性+分离属性)@retval //退出状态值 //传的是,退出状态值 对应的地址。//可以不阻塞 WNOHANG //hang on。@start_routine -- 线程执行函数 (线程回调函数)//注: 线程回调函数 --完成线程任务功能的函数。//在那个线程中调用,获得的就是那个线程的tid。@retval --- 用来保存,退出状态值,所在空间的地址。b.线程 共享了进程的资源 (代码段,数据段,打开一些文件,信号等)100 //表示等待pid号为100的子进程状态改变。

2024-08-14 19:08:53 276

原创 DAY24

3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。fork之前open,子进程会继承父进程已打开的文件的相关信息,所以此时父子进程会影响同一个offset值。execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。任何情况下,父进程都能使用wait,waitpid获得这个状态,以及资源的回收。这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错。退出状态,终止的进程会通知父进程,自己使如何终止的。如果在其他函数中则表示结束该函数。

2024-08-13 21:19:51 262

原创 DAY23

进程的相关信息通过 PCB(Process Control Block)结构体进行管理,例如进程标识符(PID)、父进程 ID 号(PPID)、当前工作路径、umask、进程打开的文件列表、信号相关设置、用户 ID 和组 ID 以及进程资源的上限等。而在 Linux 中,进程的状态更为丰富,包括运行态(R)、睡眠态(可唤醒等待态 S 和不可唤醒等待态 D)、僵尸态(Z)、暂停态(T)和结束态。进程的主要作用是实现并发,例如在无人机的控制中,可以同时进行上下左右移动和发送视频等操作。

2024-08-12 19:39:43 437

原创 DAY22

vim 编辑器,gcc 编译器 ,gdb 调试器 make。根据用户id到/etc/passwd文件下解析获得。根据用户名到/etc/passwd文件下解析获得。根据gid到/etc/group文件中解析组信息。创建一个链接向oldpath文件的新符号链接文件。根据组名到/etc/group文件中解析组信息。oldpath:被链接向的文件的路径。newpath:创建的新硬链接文件。pathname:删除文件的路径。timep:保存秒数空间的地址。timep:保存时间空间的地址。

2024-08-08 19:27:53 648

原创 DAY21

目录 当文件看,只不过操作函数和操作文件函数不一样。参数:opendir的返回结果中目录流对象。从目录流中读取文件信息并将保存信息的结构体。功能:关闭之前已经打开的目录流对象。成功返回包含路径空间的字符串首地址。获得一个文件流指针中的文件描述符。buf:保存工作路径空间的首地址。pathname:目录文件的名字。buf: 属性存放空间的首地址。打开一个目录获得一个目录流指针。size:保存路径空间的长度。fd:已经打开的文件描述符。path:改变到的路径。pathname:路径。path: 文件的路径。

2024-08-07 20:05:09 282

原创 DAY20

行缓冲,1k, terminal,主要用于人机交互stdout。如果值为整数,则文件末尾偏移。offset 要在文件内偏移的距离, 单位字节。4.fflush刷新 fflush(stdout);3.fflush来刷新 fflush(fp);unistd.h ===>POSIX 标准库。一个基于Linux内核的没有缓存的IO机制。注:不支持设备文件, 一般用于普通文件。SEEK_SET 文件的开头位置。SEEK_CUR 文件的当前位置。SEEK_END 文件的末尾位置。

2024-08-06 19:53:29 435

原创 DAY18

eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。7种,d ,-,l,p管道,s, ,c,b 用命令演示 link pip socket。1,标准io的概念 1975 Dennis r IO库,C语言的标准,ANSI c。I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input。man xxx == man 1 xxx ===>查看当前xxx命令。fgetc/fputc,,,,,,一个字符,

2024-08-05 19:54:41 385

原创 DAY17

2.位置变量: ./3.sh /etc/passwd 123 456 内置变量。4."":打印字符串,遇到$变量则打印变量中的值。'':打印字符串,遇到$变量依然打印$变量。PATH:保存当前工作的默认路径(系统路径):上一句shell命令执行的结果。``:将中间的字符串按照命令打印。写入变量不加$, 读变量加$.$$:当前shell的PID。PWD:当前所在的工作路径。$1:传入脚本的第一个参数。$2:传入脚本的第二个参数。3.shell脚本输入输出。shell脚本编写流程。$#:传入参数的个数。

2024-08-03 18:34:53 194

原创 DAY16

4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;四、结构体数组和指向结构体类型数据的指针。二、定义结构体类型变量的方法。struct 结构体名。三、结构体变量的初始化。

2024-08-01 18:08:36 324

原创 DAY15

一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。当一个指针数组作为函数形参,则函数形参为指针的指针。其中a[i][j]等价于*(*(a+i)+j)。一般形式:类型名 *数组名[数组长度]二、指针数组和指向指针的指针。指针数组作main函数的形参。

2024-07-31 18:33:48 311

原创 DAY14

3、int * const p:这里 p 不可变,p 指向的对象可变。4、const int * const p:此时 p 和 p 指向的对象都不可变,p 既不能指向其他地址,也不能通过 *p 来修改所指向对象的值。1、const int *p:此时 p 可变,p 指向的对象不可变。也就是说,p 可以指向其他地址,但不能通过 *p 来修改所指向对象的值。2、int const *p:与 const int *p 等价,p 可变,p 指向的对象不可变。例题:在大字符串中寻找小字符串。malloc函数用法。

2024-07-30 20:31:38 388

原创 DAY13

指针是一个变量,它存储的是另一个变量的内存地址。通过指针,我们可以间接访问和修改另一个变量的值。需要注意的是,当指针变量指向数组时,我们可以通过指针变量来修改数组元素的值,但不能修改指针变量所指向的数组的地址。在C语言中,数组名实际上是一个指针,它指向数组的首元素的地址。需要注意的是,指针变量本身也有自己的地址,我们可以通过。3、将偏移好的那部分内容空间当作是一个基类型变量来看。1、通过指针变量中的值到内存空间中定位。来访问数组的首元素,也可以通过。所指向的变量的值修改为10。

2024-07-29 18:03:38 338

原创 DAY12

不带参数的宏定义:用一个指定的标识符(即名字)来代表一个字符串,其一般形式为#define 标识符 字符串。在编译预处理时,将程序中在该命令以后出现的所有的标识符都用指定的字符串代替。宏名一般用大写字母表示,宏定义不是C语句,不必在行末加分号。带参数的宏定义:其一般形式为#define 宏名(参数表) 字符串。在程序中使用带实参的宏时,将实参字符串代替宏定义中的形参。使用带参数的宏时,需要注意参数的替换规则和括号的使用,以避免出现意外的结果。

2024-07-27 21:04:48 695

原创 DAY11

由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与变量作为实参一样,是单向传递,即“值传送”方式。可以用多维数组名作为函数的实参和形参,在被调用函数中形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。数组元素可以作为函数实参,其用法与变量相同。此外,数组名也可以作为实参和形参,传递的是数组首元素的地址。可以用数组名作函数参数,此时形参应当用数组名或用指针变量。数组作为函数参数传递时可以在被调函数中修改主调函数。一、数组作为函数参数。

2024-07-26 17:41:59 232

原创 DAY10

在C语言中,实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。局部变量:在函数内部定义的变量,如int x, char y等,这些变量的值存储在栈区。在C语言中,栈区主要存放函数的参数值、局部变量以及函数调用和返回时的入口参数和返回值。返回值和返回地址:函数执行完毕后,其返回值和返回地址也存储在栈区,用于控制流程的返回。程序的内存分配分为:栈区,堆区,字符串常量区,静态区(全局区),代码区。程序中不应该出现无终止的递归调用,只能出现有限次数的、有终止的递归调用。

2024-07-25 17:56:10 252

原创 DAY9.

如果是调用无参函数,则“实参函数”可以没有,但括号不能省略,如果实参列表包含多个实参,则各参数间用逗号隔开。例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。一般形式:类型说明符 数组名[常量表达式][常量表达式]a[3][4],可省略靠近变量名的,如a[][4]例如:int a[3][4],表示3行4列的数组。实参与形参的个数应相等,类型匹配。引用:数组名[下标][下标]类型标识符 函数名()

2024-07-24 18:03:04 157

原创 DAY8.

gets函数,一般形式为gets(字符数组),其作用是从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址。puts函数,一般形式为puts(字符数组),其作用是将一个字符串以‘\0’结束的字符序列输出到终端。1、一般形式:char c[100]数组存当也具有单一性,有序性,连续性。

2024-07-23 17:52:51 163

原创 DAY7.

数组存放的特点:数组元素所占字节都相同(单一性),下标小的元素靠前(有序性),元素地址之间无字节隔开(连续性)。一维数组的定义方式为 类型说明符 数组名[常量表达式],例如int a[10],此[]为类型说明符。类型说明符可以是任何已有数据类型,唯独不能是void型(空类型)。表示形式:数组名[下标],此[]为下标运算符,数组不得整体赋值。如果数组a有10个元素,若a[10]=100,则会造成越界访问。数组的数组名代表数组的首元素地址。1、一维数组的定义和引用。3、一维数组的初始化。

2024-07-22 18:32:37 131

原创 DAY6.

break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句,只能跳出当前自己所在循环。continue语句为跳过循环体下面尚未执行的语句,接着进行下一次是否执行循环的判定,也被称为循环短路语句。当表达式为非0值时,执行while语句中的内嵌语句,其特点是:先判断表达式后执行语句。表达式1为循环变量初始值,表达式2为循环的执行条件,表达式3为使循环趋于结束的语句。循环语句的三要素:循环变量初始化,循环的执行条件,有使循环趋于结束的语句。一般形式为:while(表达式)语句。

2024-07-21 14:57:54 310

原创 DAY5.

的优先级高于||、&& &&、||优先级低于关系运算符,!switch语句必须是与整型相兼容的,case后只能加常量,所有case后都要加break。三种形式的if语句中在if后面都有表达式,一般为逻辑表达式或关系表达式。左边表达式为真则输出表达式2,为假则输出表达式3。注意:逻辑表达式中应该用==而不是赋值运算符=<、<=、>、>=优先级相同,高于==、!if(表达式)语句1 else语句2。1、&&逻辑与,||逻辑或,!else if(表达式2)语句2。if(表达式1)语句1。

2024-07-19 20:41:59 212

原创 DAY4.

一般形式为putchar(c),只能输出单个字符,c可以是字符型变量或者整形变量。地址表列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。%o、%u表示八进制无符号输出,%x、%X表示十六进制输出。%m.nf,m表示共有m位数,n表示小数点后有n位有效数字。也能输出控制字符,例如putchar(‘\n’)。%g、%G,输出结果长的选%f,短的选%e或%E。(2)、按指定的宽度结束,如“%3d”,只取3列。

2024-07-18 19:08:40 264

原创 DAY3.

int = short符号位扩展:如果短数据类型为负数,则高位全补1,如水果短数据类型为正数,则高位全补0.判断左右值方法:能取地址的为左值,const int i = 2(只读变量)也为左值。表达式产生的结果均为临时变量(匿名变量),所有的临时变量都是右值,不能做自增运算。1、例如int i = 10,跟int i;i++表达式没加但i加了,++i表达式直接加(程序运行效率高)。逗号运算符:最低优先级的运算符号,从左至右,但在函数里做隔断作用。求余运算符最终结果符号与左操作数一致。

2024-07-17 18:40:45 201

原创 DAY2.

int取值范围为【-2^15,2^15-1】,unsigned int取值范围为【0,2^16-1】,signed long取值范围为【-2^31,2^31-1】,unsigned long取值范围为【0,2^32-1】。i有4个字节,实际上,数值是以补码表示的,正整数的补码即二进制形式,负数的补码为负数绝对值二进制取反再加1。十进制整数为整数形式,八进制整数为以0开头的整数,十六进制整数为以0x开头的整数。十进制小数形式、指数形式(字母e或E前面必须是数字,e或E后面必须是整数)。

2024-07-16 18:19:05 155

原创 Day1.

文件目录查看 ls,查看当前所在位置pwd,进入文件cd +文件名,返回cd ..,创建文件touch +文件名,创建文件夹mkdir +文件名,删除文件rm +文件名,删除文件夹rm +文件名 -r,拷贝文件cp,剪切文件mv。C语言常量与变量区别:在程序运行过程中,其值不能被改变的量称为常量,其值能被改变的量称为变量。变量中每一个字节都有对应的内存空间。vi main.c进入命令状态,i进入编写状态,编写完程序后esc退出编写状态,输入:wq保存并退出。

2024-07-15 17:53:55 110

空空如也

空空如也

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

TA关注的人

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