- 博客(30)
- 收藏
- 关注
原创 几种设计模式
设计模式是前辈们对代码开发经验的总结,是解决特定问题的⼀系列套路。它不是语法规定,⽽是⼀套⽤来提⾼代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决⽅案。
2025-11-06 22:34:37
75
原创 C++ 异常和智能指针
异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。抛出异常后,程序暂停当前函数的执⾏,开始寻找与之匹配的catch⼦句,⾸先检查throw本⾝是否 在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地⽅进⾏处理。如果找到匹配的catch⼦句处理后,catch⼦句代码会继续执⾏。
2025-11-03 15:16:49
816
原创 Linux 多路转接Select
本篇博客主要解决的是:Select是什么?核心定位?解决什么问题?Select的函数参数和返回值?用Select写一个Echo server 只处理读,不处理写,写的部分后面结合epoll和应用场景写。
2025-10-28 15:29:50
213
原创 Linux网络 NAT、代理服务、内⽹穿透
正向代理(Forward Proxy)是⼀种常⻅的⽹络代理⽅式,它位于客⼾端和⽬标服务器之间,代表 客⼾端向⽬标服务器发送请求。正向代理服务器接收客⼾端的请求,然后将请求转发给⽬标服务 器,最后将⽬标服务器的响应返回给客⼾端。基本原理:反向代理服务器位于客⼾端和Web服务器之间,当客⼾端发起请求时,它⾸先会到达反向代理服务器。反向代理服务器是⼀种⽹络架构模式,其作为Web服务器的前置服务器,接收来⾃客⼾端的请求, 并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客⼾端。
2025-10-27 08:32:34
449
原创 Linux网络 数据链路层
因此,除了最后⼀个报⽂之外(之前如果都是8的整数倍,最后⼀⽚的偏移量也⼀定是8的整数倍),其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了)。3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1 表⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰"更多分⽚", 如果 分⽚了的话, 最后⼀个分⽚置为0, 其他是1. 类似于⼀个结束标记。16位标识用来标识报文的唯一性,如果报文分片了,可以判断那些分片属于同一个报文。
2025-10-23 14:19:07
251
原创 Linux网络 网络层
4位头部⻓度::IP头部的⻓度是多少个32bit, 也就是 length 4 的字节数。8位服务类型:3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置 为0)。报文在网络传输的过程中,会不断的衰减,此时可以用集线器来放大信号,同时也有可能会存在环路问题,导致报文一直在一个环路里面来回的传递,所以有了TTL。因为从源IP到目的IP会有很多条路,有的路延迟比较低,有的路丢包的概率小,选择一条路去传递,这四者相互冲突,只能选择 ⼀个。8位协议:表⽰上层协议的类型,每一个协议都是有编号的。
2025-10-20 15:47:58
304
原创 Linux网络 :传输层2
在逻辑上,我们把TCP的发送和接收缓冲区,想象成一个一个线性的结构,由于TCP对要发送的信息进行了我们编号,这些编号直接或者间接转化成为了发送或者接收缓冲区的序列号。b. 我发的报文,丢失了,我知道吗?不一定,有两种情况,第一个成功发送到,但是应答,丢失了,还有一种就是我没有成功发送到。TCP将每个字节的数据都进⾏了编号,即为序列号,每⼀个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据;,所以我们需要超时间重传,超时的时间主要收到下面的影响。可以,我收到应答百分之百收到了。
2025-10-17 15:53:33
82
原创 Linux网络 应用层协议HTTP
写在前面我们认识一个协议,一般从以下几个方面去认识,第一个请求是什么,第二个,应答是什么,第三个,怎么序列化和反序例化,第四个,怎么解决数据包粘包问题。
2025-10-11 18:34:47
234
原创 Linux 进程间关系和守护进程
之前我们提到了进程的概念, 其实每⼀个进程除了有⼀个进程ID(PID)之外还属于⼀个进程组。进程组是⼀个或者多个进程的集合, ⼀个进程组可以包含多个进程。每⼀个进程组也有⼀个唯⼀的进程组 ID(PGID), 并且这个PGID类似于进程ID, 同样是⼀个正整数, 可以存放在pid_t数据类型中。比如上图就为一个进程组,他们的PGID相同。一个进程组是完成一个任务的。进程组被创建出来是为了完成某种任务。当我们在终端创建一个sleep进程组的时候,会返回一个任务号,如下图的【2】。
2025-10-10 17:38:29
279
原创 Linux SIGCHLD信号
采⽤第⼀种⽅式,⽗进程阻塞了就不 能处理⾃⼰的 ⼯作了;其实,⼦进程在终⽌时会给⽗进程发SIGCHLD信号,该信号的默认处理动作是忽略,⽗进程可以⾃ 定义 SIGCHLD信号的处理函数,这样⽗进程只需专⼼处理⾃⼰的⼯作,不必关⼼⼦进程了,⼦进程 终⽌时会通 知⽗进程,⽗进程在信号处理函数中调⽤wait清理⼦进程即可。请编写⼀个程序完成以下功能:⽗进程fork出⼦进程,⼦进程调⽤exit(2)终⽌,⽗进程⾃定 义SIGCHLD信 号的处理函数, 在其中调⽤wait获得⼦进程的退出状态并打印。
2025-09-25 18:03:19
188
原创 Linux TCP编程
因为可能会有多个链接到了,有的可能正在处理,有的可能来不及处理,来不及处理的时候就需要排队,如果最多允许四个人排队,那么backlog的值就为4,如果最多允许6个人排队,那么backlog就为5,t选项:表示的TCP协议的 l选项:表示处于监听状态的 n选项:能用数字显示的用数字显比如端口用数字显示 p:显示进程信息。新的文件描述符,TCP会产生新的套接字,也就是说刚开始创建的那个套接字是专门用来监听的,后来的套接字用来维护各自的链接。第四个:新的链接到来,需要获取链接,没有新链接到了,
2025-09-25 17:32:31
37
原创 学习过程中的一些语法问题
后面的BiTNode相当于对这个结构体进行命名,*BiTree相当于对这个结构的指针进行命名。信号当中的信号的处理方式的中定义一个函数指针。函数指针:一个例子理解函数指针。
2025-09-23 13:34:32
86
原创 Linux Socket编程
我们已经知道,内存中的多字节数据相对于内存地址有⼤端和⼩端之分, 磁盘⽂件中的多字节数据相对于 ⽂件中的偏移地址也有⼤端⼩端之分, ⽹络数据流同样有⼤端⼩端之分. 那么如何定义⽹络数据流的地址呢?可靠/不可靠:可靠的意思是,产生异常的时候会给我们各种各样的策略。信息传递的作用是被用,谁用,进程用。有无链接的意思是:比如打电话,你先“喂”一声,对面也“喂一声”,这种正式通信之前,先确认对方可不可以听到的过程就叫。,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。
2025-09-23 13:33:33
308
原创 Linux 网络基础概念
本章只做简单的理解和介绍,有一个笼统的概念。协议如何约定的?(计算机内部是怎么实现的),协议是很多的?所以OS一定要管理这些协议。所以要先描述再组织,所以协议在计算机内部本质是一个结构体。这个结构体是定义在OS内部,各种OS都认识,所以这样就建立了一种共识和约定。下面一个例子理解。
2025-09-22 09:35:45
564
原创 Linux 线程同步和互斥
只有互斥功能,有可能会造成一个线程多次的申请锁释放锁的这个过程,这样会导致效率低下的问题,其他线程会造成饥饿问题。所以有了条件变量,在临界安全的情况下,让不同线程,访问临界资源具有一定的顺序性,叫线程同步。动态分配 在栈上或者动态开辟的锁用这个初始化。
2025-09-19 15:11:22
234
原创 Linux 线程概念
进程:一个运行起来的执行流,一个加载到内存中的程序线程:进程内部的一个执行流,更加的轻量化。观点:进程是系统分配资源的基本单位,线程是CPU调度的基本单位。
2025-09-16 20:37:15
356
原创 Linux 可重入函数和volatile
不可重入:两个不同的控制流程调⽤同⼀个函数,访问它的同⼀个局部变量或参数会造成错乱的叫不可重入函数。怎么判断是可重入的函数不可重入的:一般来说用了全局变量或者全局数据,或者调用了malloc或free。重入:两个不同的控制流程调⽤同⼀个函数,访问它的同⼀个局部变量或参数不会造成错乱的叫可重入函数。重入和不可重入只是一个函数的特点,我们所学的大部分的函数都是不可重入的函数。volatile(易变关键字)
2025-09-15 09:20:53
179
原创 Linux 进程信号
进程就要记录下来对应的信号,就是保存到PCB里面,用位图的方式,修改位图的特定位置由0->1,这个过程由于PCB位内核数据结构,只能由OS进行修改,所以无论信号发送的方式是什么,最后都要通过OS向目标进程发信号。alarm调用一次只允许一个进程设置一个闹钟,以最新的为主,第二次上次设置的闹钟,会取消第一次的闹钟,并返回第一次的剩余的值。,第一个参数位信号的编号,第二个表示信号到来时处理的动作。信号来的时候,我们可能在做别的事情,所以信号。现实当中也有信号的这个概念,比如红灯,狼烟等等,这些。
2025-09-11 23:25:46
1059
原创 Linux System V 信号量和并发铺垫
如果所以进程都要先申请信号量的话,那么信号量本事就是一个临界资源信号量为了保护共享资源,那么怎么保护信号量本事呢?semflg:标志位,比如IPC_CREAT和IPC_EXCL和之前的含义一样。,保证资源不会出现多申请的情况,所以进程想访问临界资源,要先申请信号量,资源有被整体使用的情况,和没有被整体使用的情况,所以有了信号量。原子性:只有0和1两种状态,不会有其他的状态,要做就做完。信号量本是可以被多进程看到,是一个临界资源。申请信号量的本质,是对做信号量--操作。信号量本质是对资源的预订机制。
2025-09-10 23:52:20
268
原创 Linux 库制作和原理
一个可执行程序,可能会依赖多个库,如果我们只提供静态库,即使我们是动态链接,gcc也没有办法,只能对提供静态库的库进行静态链接。库是写好的现有的,成熟的,可以复用的代码,现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都要从0开始,为什么形成可执行程序的时候,告诉了动态库文件的路径和头文件的路径,还有动态库的名字后,为什么运行时还有报错呢。如果gcc后面+ -static选项,要求我们编译器使用静态链接的方案(静态库必须存在)当动态库和静态库同时存在的时候,gcc/g++默认优先使用动态库。
2025-08-30 21:55:41
297
原创 Linux EXT系列文件系统
上篇博客已经讨论了被打开的文件,那么这篇博客要讨论的是没有被打开的文件,没有被打开的文件一定是在磁盘这样的存储设备上。
2025-08-27 00:43:45
434
原创 Linux 基础IO
重定向的原理:改变文件描述符的指向,比如我关闭了1号文件描述符,然后新打开了一个文件,由于文件描述符的分配规则,会把1号文件描述符分配给这个文件,此时调用printf就会向这个文件里面打印,因为printf默认向一号文件描述符里面打印。子进程有自己的文件描述表,子进程创建PCB(拷贝父进程的PCB)->继承父进程的文件描述表(浅拷贝)->所以父子进程printf的时候,会向同一个显示器文件打印。文件描述符的分配规则:给新打开的文件分配fd,从文件描述符中寻找最小的,没有被使用的下标,作为该文件的fd。
2025-08-24 23:06:53
359
原创 Linux 进程
任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)和其他程序。注意:以后我们所指的操作系统主要是指的是操作系统的内核。更加通俗的理解就是,OS是一款软件,用来管理软硬件资源的软件。
2025-08-18 18:46:27
1130
原创 类和对象上
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例。• C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是。
2025-01-02 18:08:38
667
原创 C++入门
namespace的本质是是定义了一个域,这个域和和全局域相互独立,彼此可以定义不同的变量,避免重复,为什么要避免重复,写代码时,可能会出现多个变量名重复使用的情况,这样编译时会出现报错。以下是最为常见的错误。这是因为stdlib.h中也定义了rand,而“int rand = 10”也是在全局域中定义的,所以在printf从局部域到全局域中查找的过程中发现,局部域中没有而全局域中有两个——一个为stdlib中定义的rand函数,一个是自己定义的int rand,从而引起此报错。
2024-12-28 16:47:13
111
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅