- 博客(42)
- 收藏
- 关注
原创 帧缓存(Frame Buffer)
帧缓存,也称为帧缓冲存储器,是屏幕所显示画面的一个直接映象,又称为位映射图(Bit Map)或光栅。帧缓存的每一存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像。Linux中的帧缓存为显示设备提供了一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
2024-09-11 09:03:09
1380
原创 数据结构————哈希表
也被称为散列表,是一种根据关键值(Key value)而直接进行访问的数据结构。它通过把关键值映射到表中的一个位置来访问记录,从而加快查找的速度。这个映射函数被称为散列函数或哈希函数,而存放记录的数组则被称为散列表或哈希表。
2024-09-09 17:42:43
1267
1
原创 数据结构————二叉树
是一种树形数据结构,其中每个节点最多有两个子节点:通常被称为左子节点和右子节点。这种结构使得二叉树非常重要,因为它们具有许多有用的性质,如高效的搜索、排序和存储数据的能力。
2024-09-09 17:20:44
1000
原创 数据结构————栈、队列
在使用数组实现的队列中,如果队列的尾部已经到达数组的末尾,但数组的前部仍有空闲空间,此时队列将无法继续入队,产生假溢出。:特别是在使用数组实现的队列中,如果队列的长度远小于数组的长度,那么数组的大部分空间将被浪费。:虽然队列的遍历通常比栈更简单(因为不需要额外的空间来保存遍历过程中的元素),但在某些情况下(如需要频繁遍历队列),队列的遍历效率可能不是最优的。即最早插入队列的元素将会是第一个被移除的。:栈的遍历通常需要额外的空间来保存遍历过程中的元素,因为栈的后进先出特性使得遍历过程与元素的自然顺序相反。
2024-09-06 20:12:16
1130
原创 数据结构————内核链表
内核链表的节点通常包含至少两个指针:一个指向前一个节点(prev),另一个指向后一个节点(next)。在某些实现中,还可能包含一个指向数据本身的指针,但在Linux内核的链表中,节点本身并不直接存储用户数据,而是将用户数据保存在包含链表节点的结构体中。在双向链表中,链表头还可能包含指向链表最后一个节点的指针,以及一个指向链表第一个节点的指针。删除链表中的节点时,需要找到该节点的前一个节点和后一个节点,并修改它们的指针以绕。在链表中插入节点时,需要找到插入位置的前一个节点,并修改该节点和待插入节点的指。
2024-09-05 20:39:16
1180
原创 数据结构——双向链表
单向链表:若要删除一个节点或在某个节点后插入一个新节点,你需要访问该节点的前一个节点,这在没有头节点的情况下可能需要从头遍历链表。双向链表:由于可以双向遍历,删除节点或在节点后插入新节点时,可以直接访问到前一个节点,这使得插入和删除操作更加灵活和高效。在双向链表的最后一个节点(尾节点)中,这个指针通常为空,因为尾节点后面没有其他节点。双向链表:每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点,因此可以双向遍历。删除链表中的某个节点,需要更新被删除节点前后节点的指针。
2024-09-04 19:36:18
928
原创 tcp 网络通信及抓包工具的使用
Wireshark 是一款开源的网络协议分析工具,广泛用于网络故障诊断、安全分析、软件和网络开发的调试。它能够捕获和详细显示网络上传输的数据包,支持数百种网络协议,并提供强大的过滤和搜索功能,帮助用户快速定位问题。
2024-08-23 20:38:45
2028
1
原创 网络通信
网络通信是指在网络环境中,不同主机上的进程之间进行的信息交换。它是一种进程间通信(IPC)的形式,通常涉及到使用套接字(socket)作为通信端点。网络通信的本质是通过网络协议栈实现数据的封装、传输和解封装,使得位于不同地理位置的计算机可以相互通信和协作。
2024-08-22 19:40:05
727
原创 学习记录第二十九天
进程间通信的原理通常涉及内核提供的机制,在内核中开辟缓冲区,进程将数据从用户空间拷贝到内核缓冲区,然后另一个进程从内核缓冲区读取数据。这样的机制允许进程之间安全地交换数据。
2024-08-21 19:22:47
763
原创 学习记录第二十八天
在Linux系统中,有名管道是一种特殊类型的文件,它允许不相关的进程之间进行通信。在使用有名管道进行通信时,通常需要先运行读取数据的进程(Reader),然后再运行写入数据的进程(Writer)。而在写入数据的进程中,如果管道文件不存在,它会尝试打开它以写入数据,但可能会被阻塞,因为读取数据的进程还未启动.这里,signum是要设置处理函数的信号编号,handler是一个指向信号处理函数的指针。2.open()函数用于打开一个文件或管道,并返回一个对应的文件描述符,以便后续对文件或管道的读写操作。
2024-08-18 19:46:16
347
原创 学习记录第二十七天
创建后,父进程的标准输出文件描述符通常会被重定向到管道的写端,而子进程的标准输入文件描述符会被重定向到管道的读端。有名管道,或称为FIFO(First In First Out),是一种持久的管道,它们在文件系统中表现为特殊文件,因此可以被任何有权访问的进程使用,而不局限于具有亲缘关系的进程。有名管道可以跨越进程的创建和销毁,即使创建它们的进程终止后,这些管道仍然存在,直到被系统或管理员明确删除。无名管道在文件系统中没有对应的文件名,因此它们是匿名的,只在创建它们的进程之间可见。
2024-08-16 19:14:10
377
原创 学习记录第二十六天
在分离状态下,线程在执行完毕后,其占用的资源(如堆栈)会自动被操作系统回收,无需显式调用pthread_join函数来等待线程结束。如果锁已被其他线程持有,则请求锁的线程会被阻塞,直到锁被释放。通过将这些线程设置为分离状态,可以减少对资源的管理开销,并允许它们独立于创建它们的线程结束。此函数用于初始化互斥锁,mutex 是指向互斥锁变量的指针,attr 是指向互斥锁属性的指针,如果为 NULL,则使用默认属性。如果失败,返回一个错误码。如果互斥锁已被其他线程持有,则调用线程会被阻塞,直到互斥锁可用。
2024-08-15 18:31:26
723
原创 学习记录第二十五天
而waitpid函数则适用于需要更多控制的场景,例如等待特定的子进程、等待进程组中的任一子进程或所有子进程,或者在不阻塞父进程的情况下进行等待。waitpid函数提供了比wait更加灵活的接口,允许父进程等待特定的子进程结束,或者设置不同的等待选项。1.轻量级:线程之间的切换比进程之间的切换要轻量级,因为线程共享同一进程的资源,不需要进行系统调用,所以线程的创建和销毁成本较低。2.联系:线程是进程的一部分,一个进程可以拥有多个线程,所有线程共享进程的资源,但每个线程有自己的执行栈和寄存器。
2024-08-14 18:46:22
800
原创 学习记录第二十四天
这个函数的参数列表以NULL结尾,第一个参数通常是要执行的程序的路径,第二个参数是传递给新程序的第一个参数(通常是程序的名称),其余参数是传递给新程序的额外参数。execvp的第一个参数是要执行的程序的文件名,第二个参数是传递给新程序的参数数组。execve的第一个参数是要执行的程序的路径,第二个参数是传递给新程序的参数数组,第三个参数是新的环境变量数组。:执行指定路径的程序,并通过一个以NULL结尾的字符串指针数组传递参数。execv的第一个参数是要执行的程序的路径,第二个参数是传递给新程序的参数数组。
2024-08-13 20:18:11
596
原创 学习记录第二十三天
在Linux系统编程中,fork()函数用于创建一个新的进程,称为子进程,它是调用fork()的原始进程的副本。当一个程序被启动时,操作系统会为该程序创建一个进程,这个进程拥有自己独立的内存空间,包括代码段、数据段和堆栈等,以及一组系统资源,如文件描述符和网络连接。在操作系统中,通常通过调用fork系统调用来创建一个新进程,新进程称为子进程,而调用fork的进程称为父进程。fork会复制父进程的上下文,包括代码、数据和打开的文件描述符等,但每个进程都有独立的地址空间。bss --- 未初始化的数据 |
2024-08-12 19:46:06
951
原创 学习记录第二十二天
在Linux环境下使用C语言处理时间,通常会涉及到几个重要的头文件和函数。主要的头文件是 <time.h>,它包含了处理时间的各种函数和数据结构。1. 数据结构1.time_t: 一个类型定义,用于存储时间值,通常表示为从1970年1月1日00:00:00 UTC到现在的秒数。2.struct tm: 包含了本地时间的各个组成部分,如年、月、日、时、分、秒等。2. 函数1.time(): 返回当前时间的时间值,类型为time_t。
2024-08-08 18:59:23
679
原创 学习记录第二十一天
这些操作在各种操作系统和编程环境中都有相应的命令或函数来实现,比如在Linux中,可以通过mkdir、rmdir、mv、ls等命令进行目录操作,在C语言中,则有opendir、readdir、mkdir、rmdir等函数来实现目录操作。这里,pathname参数是一个指向文件路径的字符串,buf参数是一个指向struct stat结构体的指针,该结构体将被填充以包含文件的状态信息。1.readdir:用于读取目录流,并返回一个指向struct dirent的指针,该结构包含了目录中下一个文件的信息。
2024-08-07 18:29:46
436
原创 学习记录第二十天
行缓冲的特点是,当输入或输出操作遇到换行符('\n')时,会触发实际的I/O操作,即将缓冲区中的内容写入或从文件或设备中读取数据。此外,行缓冲区的大小通常是固定的,一旦缓冲区被填满,即使没有遇到换行符,也会进行刷新操作.在使用read函数时,需要确保文件描述符是有效的,并且缓冲区有足够的空间来存放读取到的数据.rewind函数的功能在某些情况下比fseek函数更为方便,尤其是当需要将文件指针重置到文件开头时,因为rewind会自动处理相关的状态标志,而fseek则需要手动设置这些标志.
2024-08-06 19:54:57
524
原创 学习记录第十九天
fputc 在写入成功时返回写入的字符,如果发生写入错误,则返回 EOF。它定义在 stdio.h 头文件中,并返回一个指向 FILE 结构的指针,该结构包含了有关打开文件的信息。这里的 filename 参数是一个指向字符串的指针,指定了要打开的文件的名称。fread 函数返回成功读取的数据项数量,如果达到文件末尾或发生读取错误,返回的数量可能小于 nmemb。fwrite 函数返回成功写入的数据项数量,如果发生写入错误或达到文件末尾,返回值为0。如果成功写入,fputs 返回非负数,表示写入的字符数;
2024-08-05 20:06:15
834
原创 学习记录第十八天
它可以用来输出连续的整数序列,或者根据指定的起始值、增量和结束值输出固定间隔的数字序列。在Linux系统中,Shell脚本是一种强大的工具,用于自动化任务、处理文件和系统管理。shell脚本的本质就是一系列shell命令的集合。3.seq + 选项 + 首数 + 增量 + 尾数:输出从首数开始,每隔指定增量直到达到或超过尾数的整数序列。2.seq + 选项 + 首数 + 尾数:输出从指定首数到尾数的所有整数。1.seq + 选项 + 尾数:输出从1到指定尾数的所有整数。-eq 相等。
2024-08-04 21:09:26
305
原创 学习记录第十七天
枚举类型的定义使用enum关键字,后跟枚举类型的名称和一组用大括号{}括起来的枚举常量。共用体的定义使用union关键字,并且可以包含多个成员,但在任何时刻,共用体的成员中只有一个可以含有值,其余成员则共享同一内存空间。共用体变量的地址与其成员的地址相同,因此修改共用体变量的任何成员都会影响其他成员的值。6.>>:右移运算符,将操作数的所有位向右移动指定的位数,对于无符号数,左边空出的位用0填充;5.<<:左移运算符,将操作数的所有位向左移动指定的位数,右边空出的位用0填充。C语言中的共用体(Union)
2024-08-02 20:12:40
368
原创 学习记录第十六天
链表的特点是节点在内存中可以不连续地分布,因此链表具有灵活的存储和动态扩容的能力。结构体的定义使用struct关键字,并且可以包含多种数据类型的成员,包括基本数据类型、数组、指针以及其他结构体类型。4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
2024-08-01 18:32:57
350
原创 学习记录第十五天
指向指针的指针(也称为双重指针)是一个特殊的指针类型,它不仅指向变量的地址,而是指向另一个指针的地址。双重指针通常用于处理需要修改指针指向的数据的情况,或者在需要通过指针传递指针的函数调用中。这里,data_type 是指针所指向数据的类型,array_name 是数组的名称,而 size 是数组中指针元素的数量。简称为函数指针,是编程中的一种特殊类型的指针,它指向的是函数的入口地址,而不是变量的地址。首先,你需要创建一个指针,然后创建一个指向该指针的指针(即双重指针),并将其初始化为指向那个指针。
2024-07-31 19:42:25
449
原创 学习记录第十四天
这有助于提高代码的可靠性和可读性,同时也可以避免意外修改变量的值,从而减少程序中的错误。3.数组和指针:const也可以用于指针,可以指定指针所指向的内容不能改变,或者指针本身不能改变(不能指向其他位置)。函数指针的声明需要指定函数的返回类型和参数类型,其语法类似于函数声明,但需要在类型前加上 * 符号来表示这是一个指针。:用于分配指定大小的内存空间,并返回指向该空间的指针。3.注意内存越界:在操作动态分配的内存时,不得超出分配的范围。:用于调整已分配内存的大小,可以增加或减少内存块的大小。
2024-07-30 21:19:10
468
原创 学习记录第十三天
指针是一个是一个变量,其值是另一个变量的内存地址。简单来说,指针“指向”数据的存储位置。通过使用指针,程序员可以直接访问和操作内存,这在很多情况下可以提高程序的效率和灵活性。int *ptr;这里,*ptr 表示ptr是一个指针,而int是基类型,表示ptr将指向一个整型数据的地址。这里,&num 是取地址操作符,它返回num变量的内存地址。注意,访问未初始化的指针或野指针,可能会导致程序崩溃1.通过指针变量中的值到内存空间中定位2.从定位处开始向后偏移sizeof(类型)
2024-07-29 18:27:52
397
原创 学习记录第十一天
在二维数组的例子中,列数必须在函数声明中明确指定,而行数可以作为参数传递。这是因为C语言在编译时需要知道数组的列数来正确地计算元素的地址。3.当传递数组到函数时,函数内部操作的是数组的副本,但是由于数组名本身就是地址,所以函数内部对数组元素的修改会影响到原始数组。当数组作为参数时,实际上传递的是数组首元素的地址。二维数组作为函数参数时,需要传递数组名(即数组首元素的地址),以及数组的行数和列数。一维数组作为函数参数时,通常只需要传递数组名(即数组首元素的地址)和数组的长度。
2024-07-26 20:14:33
492
原创 学习记录第十天
这种机制允许函数调用的层次结构,即一个函数可以在另一个函数的执行过程中被调用,形成嵌套调用的层级结构。在C语言中,递归是一种强大的工具,可以用来解决那些可以分解为相似子问题的任务,如计算阶乘、遍历树状结构、求解汉诺塔问题等。字符串常量区存放程序中的字符串字面量,这些常量在程序编译时就已经确定,并且在程序的整个执行期间都是不可变的。2.效率问题:递归可能会导致大量的函数调用和栈空间的使用,因此在处理大规模数据时,递归可能不如迭代效率高。这个区域通常是只读的,以防止程序在运行时意外修改自身的代码。
2024-07-25 19:34:50
317
原创 学习记录第九天
二维数组的声明格式为 `类型 数组名[行数][列数];`,例如:这里声明了一个名为 `a` 的二维数组,它有3行4列,总共12个整型元素。二维数组可以看作是数组的数组,例如a[ 3][4],可以看作是三个一维数组的集合,即a[0],a[1],a[2]三个一维数组的集合二维数组可以在声明时进行初始化,例如:如果初始化时省略行数,编译器会根据提供的列数和初始化值自动计算行数。注意:列数不能省略,若初始化时输入元素数量小于数组总元素数量,会自动补0。
2024-07-24 19:22:46
588
原创 学习记录第七天
一维数组在内存中是连续存储的,这意味着数组元素在内存中是紧密排列的,没有间隔。这种布局使得访问和操作数组元素非常高效。注意,当数组元素个数是变量时,无法进行初始化;类型符可以是int,float等,但不能是void。:使用循环结构(如for循环)可以遍历数组的所有元素,执行如求和、查找最大值或排序等操作。:可以通过数组名和索引来访问和修改数组中的元素。:数组元素通过索引访问,索引从0开始。:数组的大小在定义时固定,不能改变。
2024-07-22 18:41:13
219
原创 学习记录第六天
在`for`、`while`、`do-while`循环中,当`continue`语句执行时,会跳过循环体中`continue`之后的代码,直接进行下一次的循环条件判断。循环开始后,先对循环变量初始化,然后判断是否满足循环的执行条件,满足则进入循环,先执行循环体,然后执行使循环趋于结束的语句,再次判断是否满足循环的执行条件,.......,直到不满足循环的执行条件,跳出循环。`break`用于立即终止最内层的`switch`语句或循环(`for`、`while`、`do-while`)的执行。
2024-07-20 20:22:44
188
原创 学习记录第五天
xx为条件,a,b为要输出的数据,当条件xx为真时,i= a,当条件xx为假时,i = b。switch 只能判断 == ,无法判断<,>,>=,<=,!关系运算符的优先级低于算术运算符,但高于赋值运算符。a:b (?: 三目运算符)case之后必须是常量。关系运算符及其优先次序。
2024-07-19 20:36:11
354
原创 学习记录第三天
给长数据类型赋值段数据时,会给空缺字节补符号位,即正数补零,负数补1。给短数据类型赋值长数据时,会去掉高位字节,保留低位字节。(5)% 模运算符或求余运算符,%两侧的操作数必须是整形数据或与整形数据相兼容。不同类型的数据在运算时需要先转换为同一类型(隐式转换),在进行运算。%运算结果的符号与左操作数有关,与右操作数无关。(1)+ 加法运算符,3+2 = 5。(2)- 减法运算符,5-2=3。(3)* 乘法运算符,5*6=30。(4)/ 除法运算符,8/2=4。
2024-07-17 19:33:57
629
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅