- 博客(47)
- 收藏
- 关注
原创 Udp和Tcp
addrlen参数是⼀个传⼊传出参数(value-result argument), 传⼊的是调⽤者提供的, 缓冲区addr。bind()的作⽤是将参数sockfd和myaddr绑定在⼀起, 使sockfd这个⽤于⽹络通讯的⽂件描述符监。connect和bind的参数形式⼀致, 区别在于bind的参数是⾃⼰的地址, ⽽connect的参数是对⽅的。服务器程序所监听的⽹络地址和端⼝号通常是固定不变的,客⼾端程序得知服务器程序的地址和端。addr是⼀个传出参数,accept()返回时传出客⼾端的地址和端⼝号;
2026-03-03 15:49:09
466
原创 Linux网络基础
OSI(Open System Interconnection,开放系统互连)七层⽹络模型称为开放式系统互联参考。OSI 七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传。它的最⼤优点是将服务、接⼝和协议这三个概念明确地区分开来,概念清楚,理论也⽐较完整.把⽹络从逻辑上分为了7层. 每⼀层都有相关、相对应的物理设备,⽐如路由器,交换机;通过七个层次化的结构模型使不同的系统不同的⽹络之间实现可靠的通讯;模型,是⼀个逻辑上的定义和规范;
2026-03-03 13:54:06
45
原创 Linux进程信号
因此, 未决和阻塞标志可以⽤相同的数据类型sigset_t来存储, , 这个类型可以表⽰每个信号的“有效”或“⽆效”状态, 在阻塞信号集中“有效”和“⽆效”的含义是该信号是否被阻塞, ⽽在未决信号集中“有 效”和“⽆效”的含义是该信号是否处于未决状态。当某个信号的处理函数被调⽤时,内核⾃动将当前信号加⼊进程的信号屏蔽字,当信号处理函数返回时⾃动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产⽣,那么 它会被阻塞到当前处理结束为⽌。若act指针⾮空,则根据act修改该信号的处理动作。
2026-02-13 22:01:19
639
原创 进程间通信
⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据。通常,⼀个管道由⼀个进程创建,然后该进程调⽤fork,此后⽗、⼦进程之间就可应⽤该管道。进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够。通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进。管道是半双⼯的,数据只能向⼀个⽅向流动;我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”
2026-02-11 20:36:30
546
原创 库制作与原理
如果不进⾏合并,假设⻚⾯⼤⼩为4096字节(内存块基本⼤⼩,加载,管理的基本单位),如果.text部分为4097字节,.init部分为512字节,那么它们将占⽤3个⻚⾯,⽽合并后,它们只需2个⻚⾯。表⾥记着每个段的开始的位置和位移(offset)、⻓度,毕竟这些段,都是紧密的放在⼆进制⽂件中,需要段表的描述信息,才能把他们每个段分割开。此外,操作系统在加载程序时,会将具有相同属性的section合并成⼀个⼤的segment,这样就可以实现不同的访问权限,从⽽优化内存管理和权限访问控制。
2026-02-09 20:43:02
528
原创 LINUX-Ext系列⽂件系统
那个C,D,E就是分区。柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起始柱⾯和结束柱⾯号码。记录的信息主要有:bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。
2026-02-08 21:38:03
589
原创 LINUX-基础IO
每个文件描述符都是一个内核中文件描述信息数组的下标,对应有一个文件的描述信息用于操作文件,而重定向就是在不改变所操作的文件描述符的情况下,通过改变描述符对应的文件描述信息进而实现改变所操作的文件。⽂件的读写本质不是通过 C 语⾔ / C++ 的库函数来操作的(这些库函数只是为⽤⼾提供⽅便),⽽是通过⽂件相关的系统调⽤接⼝来实现的。打开⽂件,本质是进程打开,所以,进程知道⾃⼰在哪⾥,即便⽂件不带路径,进程也知道。磁盘上的⽂件 本质是对⽂件的所有操作,都是对外设的输⼊和输出 简称 IO。
2026-02-08 21:22:47
259
原创 进程的控制
⽤fork创建⼦进程后执⾏的是和⽗进程相同的程序(但有可能执⾏不同的代码分⽀),⼦进程往往要调⽤⼀种 exec。如果⼦进程已经退出,调⽤wait/waitpid时,wait/waitpid会⽴即返回,并且释放资源,获得⼦。最后,⽗进程派给⼦进程的任务完成的如何,我们需要知道。如果在任意时刻调⽤wait/waitpid,⼦进程存在且正常运⾏,则进程可能阻塞。⼦进程退出,⽗进程如果不管不顾,就可能造成‘僵⼫进程’的问题,进⽽造成内存泄漏。⽗进程通过进程等待的⽅式,回收⼦进程资源,获取⼦进程退出信息。
2026-02-06 11:15:49
613
原创 进程的概念
这些内容被保存在任务⾃⼰的堆栈中, ⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器,并开始下⼀个任务的运⾏, 这⼀过程就是context switch。需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影响到进程的优先级变化。优先权⾼的进程有优先执⾏权利。并发: 多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称。进程的退出状态必须被维持下去,因为他要告诉关⼼它的进程(⽗进程),你交给我的任务,我。
2026-02-06 10:56:13
579
原创 异常和智能指针
异常的抛出和捕获程序出现问题时,我们通过抛出(throw)⼀个对象来引发⼀个异常,该对象的类型以及当前的调⽤链决定了应该由哪个catch的处理代码来处理该异常。•被选中的处理代码是调⽤链中与该对象类型匹配且离抛出异常位置最近的那⼀个。根据抛出对象的类型和内容,程序的抛出异常部分告知异常处理部分到底发⽣了什么错误。•当throw执⾏时,throw后⾯的语句将不再被执⾏。程序的执⾏从throw位置跳到与之匹配的catch。
2026-02-03 20:16:59
549
原创 C++11(2)
变量表达式都是左值属性,也就意味着⼀个右值被右值引⽤绑定后,右值引⽤变量表达式的属性是左值,也就是说Function函数中t的属性是左值,那么我们把t传递给下⼀层函数Fun,那么匹配的都是左值引⽤版本的Fun函数。通过模板或 typedef 中的类型操作可以构成引⽤的引⽤时,这时C++11给出了⼀个引⽤折叠的规 则:右值引⽤的右值引⽤折叠成右值引⽤,所有其他组合均折叠成左值引⽤。Function的实参是左值,T被推导为int&,引⽤折叠为左值引⽤,forward内部t被强转为左值引⽤。
2026-02-02 21:43:41
652
原创 Linux-gdb
执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者。要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上。显⽰源代码,从上次位置开始,每次列出10⾏。单步执⾏,不进⼊函数内部, 逐过程 F10。单步执⾏,进⼊函数内部, 逐语句 F11。跟踪显⽰指定变量的值(每次停⽌时)查看当前执⾏栈的各级函数调⽤及参数。取消对指定编号的变量的跟踪显⽰。执⾏到当前函数返回,然后停⽌。是⾏号,表⽰新增断点的位置。程序的发布⽅式有两种,
2026-01-30 16:21:53
294
原创 C++11(1)
第⼀个语句就是左值引⽤,左值引⽤就是给左值取别名,第⼆个就是右值引⽤,同样的道理,右值引⽤就是给右值取别名。值得⼀提的是,左值的英⽂简写为lvalue,右值的英⽂简写为rvalue。左值是⼀个表⽰数据的表达式(如变量名或解引⽤的指针),⼀般是有持久状态,存储在内存中,我。数据值,但是不可以寻址,例如:临时变量,字⾯量常量,存储于寄存器中的变量等,也就是说左。意义,因为移动构造和移动赋值的第⼀个参数都是右值引⽤的类型,他的本质是要“窃取”引⽤的。
2026-01-30 16:00:51
563
原创 哈希Hash
理想情况是找出⼀个好的哈希函数避免冲突,但是实际场景中,冲突是不可避免的,所以我们尽可能设计出优秀的哈希函数,减少冲突的次数,同时也要去设计出解决冲突的⽅案。开放定址法中所有的元素都放到哈希表⾥,链地址法中所有的数据不再直接存储在哈希表中,哈希表中存储⼀个指针,没有数据映射这个位置时,这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成⼀个链表,挂在哈希表这个位置下⾯,链地址法也叫做拉链法或者哈希桶。从发⽣冲突的位置开始,依次线性向后探测,直到寻找到下⼀个没有存储数据的位置为⽌,如果⾛。
2026-01-30 14:01:17
683
原创 红黑树RBTree
c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则 c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上 来的。c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。分析:p必须变⿊,才能解决,连续红⾊结点的问题,u不存在或者是⿊⾊的,这⾥单纯的变⾊⽆法解决问题,需要旋转+变⾊。
2026-01-25 23:06:07
961
原创 Linux_makefile
在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运。函数的声明,⽽没有定义函数的实现,那么,是在哪⾥实“printf”函数的呢?
2026-01-25 19:27:16
871
原创 Linux权限和开发工具
最后⼀列, base 表⽰的是 "软件源" 的名称, 类似于 "⼩⽶应⽤商店", "华为应⽤商店" 这样的概念.⽽如果⽬录具有 -x 权限,但没有 -r 权限,则⽤⼾可以执⾏命令,可以 cd 进⼊⽬录。按「i」切换进⼊插⼊模式「insert mode」,按“i”进⼊插⼊模式后是从光标当前位置开始输⼊。在⽬录 /etc/ 下⾯,有个名为vimrc的⽂件,这是系统中公共的vim配置⽂件,对所有⽤⼾都有。不过有⼀点要特别注意,就是你进⼊vim之后,是处于[正常模式],你要切换到[插⼊模式]才能够。
2026-01-22 18:22:06
892
原创 AVLTree
通过下图可以看到,左边⾼时,如果插⼊位置不是在a⼦树,⽽是插⼊在b⼦树,b⼦树⾼度从h变成h+1,引发旋转,右单旋⽆法解决问题,右单旋后,我们的树依旧不平衡。右单旋解决的纯粹的左边⾼,但是插⼊在b⼦树中,10为跟的⼦树不再是单纯的左边⾼,对于10是左边⾼,但是对于5是右边⾼,需要⽤两次旋转才能解决,以5为旋转点进⾏⼀个左单旋,以10为旋转点进⾏⼀个右单旋,这棵树这棵树就平衡了。场景1:h >= 1时,新增结点插⼊在e⼦树,e⼦树⾼度从h-1并为h并不断更新8->5->10平衡因⼦,
2026-01-22 17:39:33
627
原创 Linux初识
mv命令是move的缩写,可以⽤来移动⽂件或者将⽂件改名(move (rename) files,经常⽤来备份⽂件。head 与 tail 就像它的名字⼀样的浅显易懂,它是⽤来显⽰开头或结尾某个数量的⽂字区块,head ⽤。功能:⽤于查看⽇历等时间信息,如只有⼀个参数,则表⽰年份(1-9999),如有两个参数,则表⽰⽉份。less ⼯具也是对⽂件或其它输出进⾏分⻚显⽰的⼯具,应该说是linux正统查看⽂件内容的⼯具,-F 在每个⽂件名后附上⼀个字符以说明该⽂件的类型,“*”表⽰可执⾏的普通⽂件;
2026-01-18 18:52:40
243
原创 二叉搜索树
若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值。若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值。它的左右⼦树也分别为⼆叉搜索树。
2026-01-17 16:58:13
198
原创 vector
引用传递 (: 整个递归过程中,大家共用同一个string对象。这比每次递归都拷贝一个新的字符串要节省大量内存和时间。因为共用同一个对象,所以必须有“撤销” (pop_back的操作,用来清理现场。递归深度 (indexindex代表树的深度。index = 0选第一个数字对应的字母。index = 1选第二个数字对应的字母。时间复杂度其中 N 是对应 3 个字母的数字个数(如 2,3,4,5,6,8),M 是对应 4 个字母的数字个数(如 7,9)。简单来说,就是所有可能组合的总数。
2025-12-14 19:38:42
880
原创 内存管理(new和delete)
局部变量是存放在栈中的,自己new/malloc开的空间是存放在堆中的,全局变量和静态变量存放在数据段,常量在代码段。映射方式,用于装载一个共享的动态内存库。用于程序运行时动态内存分配,堆是可以上增长的。课程如果没学到这块,现在只需要了解一下)创建共享共享内存,做进程间通信。返回值等等,栈是向下增长的。存储全局数据和静态数据。可执行的代码/只读常量。
2025-11-28 16:57:03
116
原创 C++基础
使用缺省值,必须从右往左连续使用,传入参数时,从左往右连续传参。重载,允许函数命名相同,形参不同(参数个数,类型,类型顺序)::的作用限定,左边为空就是全局找。返回值不同不能构成重载。
2025-11-21 21:35:41
92
原创 二叉树堆2
大堆(最大堆)的定义首先满足完全二叉树的结构特征,即除最后一层外,每一层节点数均为最大值,最后一层节点从左到右连续排列。树中每个父节点的值,都大于或等于其左右子节点的值(没有要求左右子节点值的大小关系)。堆的根节点是整个堆中的最大值。小堆(最小堆)的定义同样基于完全二叉树结构,结构要求与大堆一致。树中每个父节点的值,都小于或等于其左右子节点的值(同样不限制左右子节点的大小顺序)。堆的根节点是整个堆中的最小值。一个二叉树有N个节点,高度h为log2N。
2025-11-14 12:29:27
254
原创 树的学习1
父节点下标为i,左孩子下标是2*i+1,右孩子是2*i+2。堆:1是完全二叉树,2大堆:任何一个父亲都≥孩子。3小堆:任何一个父亲都≤孩子。双亲节点:一个节点含有子节点,则这个节点称为子节点的双亲节点。任何一棵树由根+N个子树构成(N>=0)。满二叉树有k层,则有2^(k-1)个节点。堆的特点:根是最小或最大,可以用来找极值。孩子节点:一个节点含有的子树的根节点。节点的度:一个节点含有子树的个数。树的高度:树中节点的最大层次。二叉树:度最多为2的树。叶节点:度为0的节点。
2024-08-04 19:12:59
168
原创 栈与队列2
队列特点:先进先出。队尾:入数据端,队头:出数据端。队列可以保持公平性,例如应用在抽号方面。队列也常应用于广度优先遍历。队列的实现用单链表。free指针是free掉指针指向的内容,而不是指针本身。
2024-08-01 16:57:03
235
原创 栈与队列1
2.栈在进行操作时,只能在固定的一端进行操作,入栈是在栈顶,出栈也是在栈顶,同时,栈只能先进后出。1.realloc进行扩容时,如果是原地扩容就不会管,异地扩容会自动释放掉原来的内存。3.栈的实现一般用数组。
2024-07-23 16:51:58
184
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅