自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Day02 TCP UDP协议的网络通信模型 及封装

返回值:连接成功时返回一个新的socket描述符,用于与连接者进行通信,每连接一个都会分配一个新的socket描述符。//地址簇 AF_INET。转成大端:htonl(192<<24|168<<16|23<<8|1<<0)功能:把字符串格式的点分十进制ip地址转换成整数形式的ip地址(大端)转成整数:192<<24|168<<16|23<<8|1<<0。功能:把整数形式的ip地址转换成字符串格式的点分十进制ip地址。

2023-05-03 22:06:01 166

原创 Day01同一计算机的Socket进程之间通信

实际传递的是sockaddr_un或者sockaddr_in结构体地址,但是最终都要把它们转换成sockaddr*,因为C语言不支持自建类型自动识别转换,因此要强转。基本特点:Socket是一种接口技术,被抽象成一个文件操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机的进程之间进行通信(网络)__kernel_sa_family_t sun_family;AF_UNIX/AF_LOCAL 本地通信(进程间通信)

2023-05-03 22:05:17 249

原创 Day07 进程间通信

文件描述符\文件指针需要借助唯一的文件名进行建立,IPC标识符的创建需要借助IPC键值(整数),如果想要创建不同的IPC标识符,需要一个独一无二的IPC键值(别人也没用过)什么是进程间通信:是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据。2、如果信号量的值等于0,说明没有资源可以使用,此时进程进入休眠,直到信号量的值>0,进程会被唤醒,执行步骤1。管道是一种特殊的文件,它的数据在文件中是流动的,读取之后就消失,如果文件中没有数据可读取时读取操作会阻塞。

2023-05-01 21:11:46 115

原创 Day06 进程管理

孤儿进程:父进程先于子进程结束,子进程变成孤儿进程,被"孤儿院"领养,大部分情况下init(1)是孤儿进程的父进程,由它来回收死亡后的孤儿进程的资源。一个进程可以创建另一个进程,创建者叫做父进程,被创建这叫做子进程,子进程被父进程创建启动后会在操作系统的调度下可以同时运行。返回值:一次调用,两次返回,子进程返回0,父进程返回子进程的ID,当进程的数量超过系统的最大进程数时,则创建子进程失败,返回-1。僵尸进程:子进程先于父进程结束,如果结束时父进程没有回收资源,子进程就变成僵尸进程。

2023-05-01 21:10:34 99

原创 Day05 Linux的信号处理

注意:虽然有些信号可以捕获,但是产生该信号的错误原因(段错误\除0)依旧还在,如果信号处理函数执行完后不终止进程,就会返回到产生错误的位置,导致死循环,正确的操作是保存数据后,终止进程。4、捕获并处理信号(在信号发出前,向内核注册一个信号处理函数,绑定该信号与信号处理函数,当信号发出后,会执行信号处理函数)//在该函数执行时,默认会屏蔽当前信号,如果想要屏蔽其他信号,可以向sa_mask中增加信号。//第一次信号产生的时间。信号是一种软件中断,是由操作系统发出的中断信号,被程序接收后执行相应的操作。

2023-04-30 22:14:42 59

原创 Day04 系统IO读写文本的文件

每个文件都有一个唯一的inode和若干个block,当要读取文件时需要先借助目录文件的block中记录的目录中文件的文件名和inode号来找到该文件的inode,从而读取到对应的block数据块。硬链接文件:硬链接文件没有专门创新的独属于自己的inode和block,只是在不同于被链接文件的目录中复制了一份被链接文件的inode,通过该inode也可以访问被链接文件的block。软链接文件:软链接文件会建立属于自己的新的inode和block,但是block中存储的是被链接文件的inode号和文件名。

2023-04-30 22:13:32 53

原创 Day03 Linux的内存管理 虚拟内存 系统调用

原因:标准IO中有缓冲区机制,在写数据时不是每次都调用系统IO,而是把写入的数据存储在临时的缓冲区中,当缓冲区满时,才会调用一次系统IO写入数据到文件中。8、当进程处于内核态时,进程运行存储使用在内核空间,此时CPU可以发出执行任何指令,运行的代码不受任何限制,可以自由地访问任意有效的地址,也可以直接访问接口。系统调用就是操作系统提供的一些功能以函数的形式给程序员使用,但是虽然格式很像标准C的函数,但是它们不是标准C的内容,也不是真正的函数。

2023-04-30 22:09:27 353

原创 Day02 库 静态库 共享库 环境变量表 错误处理

当调用共享库时,在使用共享库代码的地方形成一个入口,该入口记录了调用的代码在共享库中二进制指令的位置,并且当执行可执行文件时,共享库会与可执行文件一起加载到内存中,当执行共享库的代码时,程序就会跳转到对应的共享库中执行,执行完后可能会返回。注意:共享库要一起与可执行文件加载到内存中才能运行,但是加载执行共享库的路径与编译使用共享库的路径是两种查找路径,因此还需要额外设置共享库的加载路径,一般通过设置环境变量LD_LIBRARY_PATH来实现。

2023-04-30 22:08:12 75

原创 Day01 UNIX系统 Linux系统介绍

Linux的标志:企鹅,因为企鹅是南极洲的标志性动物而当时南极是没有被任何国家占领,是属于全人类的,符合Linux开源的风格。GPL通用许可证:任何在带有GPL证书的代码的基础上开发、修改出来的软件、代码,也必须支持GPL许可证书,确保开源免费。Linux只是表示内核是Linux,只要操作系统的内核是Linux,则可以称该系统属于Linux操作系统。GNU组织:通用的非商业的类UNXI,目前全球最大的开源组织,负责维护和开发Linux的内核源。预处理: gcc -E code.c -o code.i。

2023-04-30 22:07:18 59

原创 Day10查找 排序

在中间位置确定为标杆p,备份标杆的数据为val,从左边找比val大的数据,找到后位置为l,然后把该数据赋值给p位置,更新p为l,然后从右边找比val小的数据,找到后位置为r,然后把该数据赋值给p位置,更新p为r,重复以上过程,直到l和r相遇时,结束此次排序,最后把val还原赋值给p位置,最终p左边都比val小,右边都比val大,局部有序。根据数据的值,存储到不同的桶中,然后调用其他的排序算法,对桶中的数据进行排序,然后再全部按桶的顺序拷贝回数组中,以此降低排序的规模来提高排序速度,以空间换时间的排序算法。

2023-04-17 00:43:11 49

原创 Day9红黑树 哈夫曼树 图

是一棵自平衡的有序二叉树,但是它不是根据高度差调整平衡的,而是给节点设置红色或黑色,根据颜色关系调整平衡,最终最长路径不会超过最短路径的两倍,接近平衡。2、规定哈夫曼树的最分支为0,右分支为1,从根节点到每个叶子节点经过的路径组成的0和1的序列就是该对应字符的哈夫曼编码。3、待删除的节点度为2,根据左右子树高度,选择高的分支,如果左子树高选择最大节点,如果右子树高选择最小节点替换,重新调整。在无向图中,任意两个顶点之间都有边,如果有n个顶点的完全无向图中,有 n*(n-1)/2 条边。

2023-04-17 00:40:58 36

原创 Day08 堆 堆结构的删除 堆排序 平衡二叉树

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。不停地重复执行删除堆顶的操作,直到删除全部元素,最终整个存储元素的内存就有序了。前提是一棵有序二叉树,它的左右子树高度差不超过1,同时它的所有子树也要满足该条件。/ \ 以y为轴左旋转 / \ / \。创建、销毁、添加、删除、空堆、满堆、堆顶。1、堆顶与末尾元素交换,删除末尾。以z为轴右旋转 以z为轴左旋转。是完全二叉树,不适合链式存储的树。以z为轴左旋转 以z为轴右旋转。存储数据的内存首地址。

2023-04-17 00:40:10 86

原创 二叉树 顺序 链式存储 有序二叉树 线索二叉树 选择二叉树 堆

是一种完全二叉树,把要存储的数据存放在最后一层,根节点是左右子树中的其中一个,可以是最大的,或者最小的,选择树的功能是快速地找出其中最大(胜者树)或者最小值(败者树)因此链式二叉树中有很多的空指针,可以在有序二叉树中,让这些空指针指向下一个\前一个节点,这样有序遍历树时可以不使用递归而是使用循环进行,以此提高树的遍历效率。注意:由于这种树的中序遍历是从小到大,所以有序二叉树也是一种排序算法,并且有序二叉树中查找某个值,天然是二分查找,所以经常考。有序二叉树:(二叉排序树、二叉搜索树、二叉查找树)

2023-04-09 20:56:41 120

原创 通用链表 数组与矩阵 稀疏矩阵 特殊矩阵 无规律矩阵

稀疏矩阵:矩阵有存储有效数据不多,绝大多数都是无效信息数据不需要存储,数量的多少没有特定的标准,全凭感觉。对应关系:(i+1)*i/2+j 或者 (j+1)*j/2+i ->对应的一维数组下标。对称矩阵:沿着 (0,0)(1,1)(2,2)...(i,i)对称存储。对应关系:(j+1)*j/2+i ->对应的一维数组下标。对应关系:(i+1)*i/2+j ->对应的一维数组下标。数组的长度:n*(n+1)/2。数组的长度:n*(n+1)/2。数组的长度:n*(n+1)/2。采用三元组方式进行压缩。

2023-04-09 20:53:51 153

原创 栈 顺序栈 链式栈 队列 顺序队列 链式队列

由一维数组组成,队头位置head+队尾位置tail表示,如果入队则tail+1,出队则head+1,为了让队列循环使用,我们把队列看作一个环,因此每次+1操作都对队列容量取余。还可以多加一个数据项,表示队列中的元素数量,也可以解决该问题,还不需要多申请一个容量,但是是非常规的解决防范,不常考。创建、销毁、入队、出队、队空、队满、队头、队尾、数量。创建、销毁、入队、出队、队空、队头、队尾、数量。创建、销毁、入栈、出栈、栈满、栈空、获取栈顶、数量。创建、销毁、入栈、出栈、栈空、获取栈顶、数量。

2023-04-02 21:27:41 60

原创 封装单链表 静态 循环 双向链表

链表的最后一个节点的next不再指向NULL,而是指向头节点,这种链表称为单向循环链表,简称循环链表,它的优点是可以通过任意节点遍历整个链表。这种链表没有指针域,在插入、删除时通过修改游标的值完成,而不需要动态申请、释放内存,但是也可以实现链式的效果。链式结构:数据存储在不确定位置的内存中,数据项中有一块指针域,用来表示数据之间的关系。顺序结构:数据存在连续的内存中,使用数据之间的相对位置表示数据之间的关系。静态链表的节点存储在连续的内存中,通过游标来访问下一个节点。top初值:0 先入栈,再top++

2023-04-02 21:26:04 72

原创 数据结构 顺序表 链式表

删除节点时,需要分两种情况:1、待删除的是第一个节点时,也会修改指向第一个节点的指针,就需要传递二级指针 2、待删除的不是第一个节点时,就正常删除。链式结构:数据元素存储在彼此相互独立的内存空间中,每个独立的数据元素称为节点,每个节点中增加一个数据项用于存储其它节点的地址,用于表示数据节点之间的关系。优点:无论是否头插入还是头删除,头节点永远不变,变的只是头节点的next,所以不用传递二级指针,也不用额外处理头删除。创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历。

2023-04-02 21:25:33 53

原创 如何编写头文件及使用Makefile

在终端执行 make 命令就会自动执行Makefile脚本中的编译指令,它可以根据文件的修改时间、和依赖关系来判断哪些文件需要编译,哪些不需要编译。假如a.h包含了b.h的内容,而b.h中又包含了a.h的内容,这时就会产生头文件的相互包含,无法编译通过。解决方案:把a.h中需要b.h的内容,和b.h中需要a.h的内容提取出来,额外再写另一个c.h。2、如果需要用到某个.c文件中的变量、函数、宏时,只需要把该文件的.h文件导入即可。1、为每个.c文件写一份.h文件,.h文件是对它对应的.c文件的说明。

2023-03-19 20:32:37 898

原创 字符串 字符串相关函数

情况1:需要输入的是整型\浮点型时,而缓冲区中的数据是字符型或符号时,此时读取会失败,并且该数据会继续残留在输入缓冲区中,会继续影响剩下的输入。情况3:当先输入整型或浮点型,再输入字符型时,输入完整型或浮点型后按下的回车或空格,会残留在输入缓冲区,刚好被后面的字符型接收,影响输入。程序中输入的数据并不会立即从键盘接收到变量中,而是当按下回车后先存储到输入缓冲区中,然后再从缓冲区中读取到变量内存中。解决:根据scanf的返回值判断输入是否有问题,如果读取失败,则先清理输入缓冲区后重新输入,直到读取成功为止。

2023-03-19 20:31:04 39

原创 预处理指令 宏函数

由于宏函数代码位置、附近的值、参数各种原因的影响,会导致宏函数有不同的解释,这叫做宏的二义性。翻译的过程称为预处理,负责翻译的程序称为预处理器,被翻译的语句叫做预处理指令,以#开头的都是预处理指令。每个参数都加小括号,整体也叫小括号,不要在宏函数的参数中使用自变运算符。注意:宏的内容必须保证在同一行,如果要换行,要在每一行的末尾添加续行符 \。不是真正意义的函数,没有发生传参,也没有返回值,也不会去检查参数的类型。1、先把在代码中出现了宏函数的位置,替换成宏函数后面的语句。

2023-03-19 20:30:23 82

原创 堆内存 mallco

1、当首次向malloc申请内存时,malloc会向操作系统申请堆内存,操作系统会直接分配33页(1页=4096字节)内存给malloc管理,但这样不意味着可以越界访问,因为malloc可能会把内存分配给"其他人"使用,这样就产生了脏数据。2、每个内存块之间一定会有一些空隙(4~12字节),一部分空隙是为了内存对齐,其中一定有4个字节用于记录malloc的维护信息,如果维护信息被破坏会影响下一次的free的调用。功能:从堆内存中申请size个字节的内存,申请成功会得到连续的内存。

2023-03-19 20:29:47 76

原创 Week 02 复习

指针是一种特殊的数据类型(eg:int char),使用它可以定义指针变量,指针变量存储的是整型数据,该数据代表了内存的编号(地址),可以通过这个编号访问到对应的内存(背)

2023-03-12 21:26:06 51

原创 Week01 复习

Linux C语言学习

2023-03-05 22:47:03 54

空空如也

空空如也

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

TA关注的人

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