- 博客(39)
- 收藏
- 关注
原创 同步&异步日志系统-日志器的实现
该模块是针对于前几个模块的整合,也是直接面向客户所使用的,对于该模块的实现,我们基于:继承+建造者设计模式来实现;因此我们需要抽象出一个日志器抽象基类;该基类提供的接口如下:1、 debug();//站在用户的角度来说就是我只需要调用该接口就能完成debug版本日志消息的输出;
2025-02-17 20:31:23
672
原创 同步&异步日志系统-日志落地模块的实现
功能:将格式化完成后的日志消息字符串,输出到指定的位置扩展:支持同时将日志落地到不同的位置位置分类:1.标准输出2.指定文件(时候进行日志分析)3.滚动文件(文件按照时间/大小进行滚动切换)扩展:支持落地方向的扩展用户可以自己编写一个新的落地模块,将日志进行其他方向的落地。实现思想1.抽象出一个落地基类2.之后根据落地方向从基类派生出不同落地方向的子类3.使用工厂模式进行创建与表示分离。
2025-02-17 17:41:07
394
原创 同步&异步日志系统-日志实用类、等级类、消息类的实现
先将日志系统所包含的所有日志等级分类枚举出来UNKKNOW=0,位置默认的等级DEBUG: 调试等级的日志INFO: 提示等级的日志WARN: 警告等级的日志ERROR: 错误等级的日志FATAL: 致命错误等级的日志OFF: 任何日志都不能输出每一个项目当中都会设置一个默认的日志输出等级,只有输出的日志等级大于等于默认限制等级的时候才可以进行输出。
2025-02-17 16:51:27
290
原创 同步&异步日志系统-设计模式
在继承类时,务必重写⽗类中所有的⽅法,尤其需要注意⽗类的protected⽅法,⼦类尽量不要 暴露⾃⼰的public⽅法供外界调⽤。使⽤建议:⼦类必须完全实现⽗类的⽅法,孩⼦类可以有⾃⼰的个性。⽤例:跑步运动员类-会跑步,⼦类⻓跑运动员-会跑步且擅⻓⻓跑, ⼦类短跑运动员-会跑步且 擅⻓短跑。⽤例:⽼师让班⻓点名--⽼师给班⻓⼀个名单,班⻓完成点名勾选,返回结果,⽽不是班⻓点 名,⽼师勾选。⽤例:修改密码,不应该提供修改⽤⼾信息接⼝,⽽就是单⼀的最⼩修改密码接⼝,更不要暴 露数据库操作。
2025-02-17 16:51:04
539
原创 同步&异步日志系统-项目介绍
为什么需要⽇志系统⽣产环境的产品为了保证其稳定性及安全性是不允许开发⼈员附加调试器去排查问题, 可以借助⽇志系统来打印⼀些⽇志帮助开发⼈员解决问题上线客⼾端的产品出现bug⽆法复现并解决, 可以借助⽇志系统打印⽇志并上传到服务端帮助开发⼈员进⾏分析对于⼀些⾼频操作(如定时器、⼼跳包)在少量调试次数下可能⽆法触发我们想要的⾏为,通过断 点的暂停⽅式,我们不得不重复操作⼏⼗次、上百次甚⾄更多,导致排查问题效率是⾮常低下,可 以借助打印⽇志的⽅式查问题。
2025-02-17 16:44:44
257
原创 网络基础-初识网络
在计算机网络中,协议是计算机网络中各种设备之间通信的规则和标准。它们定义了不同类型的计算机、服务器、路由器、交换机等设备之间如何进行通信、交换数据和控制信息的方式。通俗来说,协议就是一种约定。协议在计算机网络中扮演着重要的角色,使得不同设备之间的通信更加高效、安全和可靠。计算机之间的传输媒介是光信号和电信号。通过频率和强弱来表示 0 和 1 这样的信息,要想传递各种不同的信息,就需要约定好双方的数据格式。进行通信的两台主机,并不是在软件层面上约定协议就可以了。
2025-02-14 16:57:10
477
原创 linux-线程
进程是操作系统分配资源的基本单元。线程是操作系统调度的基本单元。进程是由线程构成的,每一个进程至少会有一个线程。线程是在进程的地址空间内运行。线程也需要被管理,但是线程的控制块是被保存在用户区当中的共享区内。tid就是该线程块的地址。线程比进程更加轻量化。已初始化和未初始化的全局变量是共享的。线程在切换的时候,不需要切换进程地址空间这些结构,只需要切换一部分的寄存器和栈,信号表等就可以。线程也有自己的lwp。lwp与pid相同的那个线程被称为主线程,也就是第一个线程。
2024-12-07 16:42:52
781
原创 linux-信号
信号是发给进程的,进程接收到信号后会有内置的对应信号的处理行为。信号是操作系统发给进程的,用户只是让操作系统发给进程。进程必须要有识别信号,并且处理对应信号的能力。即使没有收到信号,也需要直到该信号的处理方法。在进程收到信号时,也许并不适合立即处理该信号,会把这个信号保存起来,合适的时候再进行处理。也就是说,在信号产生时到信号被处理之前,会有时间窗口,进程具有分辨哪些信号被处理了的能力。自定义信号处理用户也可以将信号处理的动作自定义,让这个信号的处理按照自己定义的来执行。前台进程和后台进程。
2024-11-26 15:11:50
551
原创 linux-进程间通信
进程的通信是两个或多个进程实现数据的交互,让不同的进程看到同一份资源,而这份资源是由操作系统创建管理的。如果让其中一个进程来提供的话会破坏该进程的独立性,因为这个进程内部的数据可以被其他进程看到,那这个独立性就遭到了破坏。
2024-11-24 16:25:13
929
原创 linux-inode和软硬链接
硬链接并不是一个独立的文件它与原文件时同一个inode,并且文件的硬链接数会打印在文件权限的右边,可以看到temo.c的硬链接数是2.这个统计硬链接数的属性,本质上就是一个引用技术,保存着映射指向该inode的文件名有几个。软链接既然是独立的文件,那么也有自己独立的数据块,这个数据块里保存着的就是指向的文件的路径,对软链接调用就是通过软链接保存的路径去找到目标文件进行调用。软链接是一个独立的文件,因为软链接和原文件的inode是不相同的,每一个文件只有一个inode。ln -s 原文件 软连接文件名。
2024-11-15 15:57:12
282
原创 linux-缓冲区
调用系统调用接口是需要时间成本的,如果使用缓冲区,存储的字符串到一定长度再调用系统调用,能够有效减少调用系统调用的次数。这个缓冲区是语言设置的,缓冲区满足条件就用系统调用接口write将缓冲区的内容刷新到linux内核中。也就是说这些要写入的库函数,里面必定封装了对应的系统调用。每个被打开的文件都有对应的语言级别的缓冲区。无缓冲:直接刷新 fflush可以直接刷新。全缓冲:缓冲区满了刷新 文件写入是全缓冲。行缓冲:有\n刷新 显示器就是行刷新。缓冲区保存在各自的文件流FILE对象里。
2024-11-14 14:49:04
346
原创 linux-文件的读写
操作系统一切皆文件,访问文件实际上就是访问硬件,因为文件都保存在硬件上,或者文件就是硬件,而要访问硬件,就需要操作系统提供的系统调用,所以c/c++函数中关于访问硬件设备,基本上是由系统调用封装而成的。
2024-11-13 09:23:50
615
原创 linux操作系统进程
linux操作系统是对下的软硬件进行管理,为了能够对上提供稳定,快速,安全的服务而诞生的软件。广义上的操作系统是包含搭载在操作系统上的软件和函数库等文件的。狭义上的操作系统就是操作系统内核,进行进程管理,文件管理,驱动管理,内存管理而linux对用户提供服务的方式是系统调用接口,系统调用接口实际上是用c语言实现的操作系统内部的函数调用。因为操作系统不相信用户,所以就用有限制的系统调用接口来为用户提供服务。
2024-11-03 10:14:19
955
原创 linux-gcc/g++ 和makefile的使用
gcc和g++是一款编译语言的编译器,可以在linux上编译c语言文件和c++文件。格式:gcc/g++ 目标文件在不加任何选项的时候,编译出来的可执行文件名默认是 a.out。
2024-10-29 17:22:12
789
原创 linux文件的权限
在linux操作系统中,账户分为两类,一类是普通用户,一类是超级用户,普通用户在许多方面受权限约束,而超级用户几乎不受约束。
2024-10-27 15:59:44
870
原创 linux指令笔记
lyt :是用户名@iZbp1i65rwtrfbmjetete2b2Z :这个是主机名~ :这个是当前目录$ :这个是命令行提示符每个指令都有不同的功能,大部分指令都可以带上选项来实现不同的效果。一般指令和选项的格式:指令 选项需要注意的是,指令和选项当中一定要有空格。指令的本质就是可执行程序,指令存储在/usr/bin目录中。
2024-10-26 19:09:30
1181
原创 linux-xshell 云服务器的登陆
需要先购买一个云服务器,我选择的是centos版本。不需要什么配置,最便宜的那种轻量应用云服务器就可以。在购买好云服务器后,进入控制台。我这里购买的是阿里云服务器搜索轻量应用服务器在使用之前只需要改下密码就可以。
2024-10-23 10:26:04
792
原创 linux-进程
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入。进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。描述本进程的唯一标示符,用来区别其他进程。
2024-10-09 19:36:32
964
1
原创 linux-自动化构建工具与进度条程序的实现
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂。只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,在完成进度条之前,需要会一个标识符,\n,能够将光标返回当前行的开始位置。实现进度条可以创建三个文件,分别是声明文件,功能实现文件,执行文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么。而对于所定义的命令的错误,或是编译不成功,
2024-09-26 16:48:43
629
原创 linux编译器 gcc/g++的使用
此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。在编译链接时并没有把库文件的代码加入到可执行文件中。默认生成的二进制程序,是动态链接的,这点可以通过。在编译时默认使用动态库。把库文件的代码全部加入到可执行文件中。你需要把它重定向到一个输出文件里面。就不再需要库文件了。编译到汇编语言不进行汇编和链接。此选项对生成的文件采用静态链接。在预处理结束后停止编译过程。连接(生成可执行文件或库文件。该选项只进行编译而不进行汇编。以确定代码的实际要做的工作。汇编阶段是把编译阶段生成的。
2024-09-23 16:29:54
653
原创 linux的权限
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2024-09-19 19:35:16
969
原创 linux的基本指令
在linux当中,文件的类型并不由后缀决定,,一类就是由touch创建的普通文件,还有一类是目录文件,其中超过百分之90的文件都是这两类文件。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理。命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),将所给的源文件或目录重命名为给定的目标文件名。指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类。
2024-09-19 16:35:55
660
原创 c++的多态
重写/覆盖: 子类中有一个跟父类完全相同的虚函数,子类的虚函数重写了基类的虚函数即:子类父类都有这个虚函数 + 子类的虚函数与父类虚函数的 函数名/参数/返回值 都相同 -> 重写/覆盖(注意:参数只看类型是否相同,不看缺省值)(只有重写要求原型相同,原型相同就是指 函数名/参数/返回值都相同)函数重载:在同一个作用域中,两个函数的函数名相同,参数个数,参数类型,参数顺序至少有一个不同,函数返回值的类型可以相同,也可以不相同。
2024-07-26 21:25:41
309
原创 c++的继承
定义:继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的新类,称派生类(或子类),被继承的类称基类(或父类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。之前接触的复用都是函数复用,继承是类设计层次的复用。
2024-07-19 21:58:59
914
原创 优先级队列的模拟实现
优先级队列(priority_queue)其实更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。这个优先级可以通过元素的大小等进行定义。比如定义元素越大优先级越高,那么每次出队,都是将当前队列中最大的那个元素出队。个人感觉这就是所谓“优先级”的定义。现在看优先级队列是不是就是“堆”了,如果最大的元素优先级最高,那么每次出队的就是当前队列中最大的元素,那么队列实际就相当于一个大顶堆,每次将堆根节点元素弹出,重新维护大顶堆,就可以实现一个优先级队列。
2024-07-19 13:27:39
955
原创 vector的模拟实现
1.vector 是表示可变大小数组的序列容器,就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。2.本质讲, vector 使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2024-06-20 12:50:50
612
原创 string的模拟实现
然后将tmp与被拷贝构造的string类对象 this 交换,这样一来this就成为了str的拷贝,tmp存储的是原来this所存储的数据,之后在出拷贝构造函数的作用域时,tmp会进行析构,把原来属于this的数据析构掉,这样一来拷贝构造就完成了。首先检查需要的大小是否大于原来的空间,大于则直接在动态内存当中开辟想要的大小,然后将原本存储的数据拷贝到新的动态内存当中,将原本的动态内存释放,str的地址修改为新的动态内存地址,然后修改size和capacity的大小。
2024-06-17 19:23:32
846
原创 排序的算法
3、在走的过程中,若end遇到小于key的数,则停下,begin开始走,直到begin遇到一个大于key的数时,将begin和right的内容交换,end再次开始走,如此进行下去,直到begin和end最终相遇,此时将相遇点的内容与key交换即可。3.将tmp从后往前依次和有序部分的数进行比较,设置一个寻找比较的指针为end,如果该tmp小于end指向的数,则将end指向的数赋值给end+1所指向的位置,end--4.此时key的左边都是小于key的数,key的右边都是大于key的数。
2024-05-07 15:17:47
730
原创 堆的概念和实现(Heap)
堆的实现需要用到完全二叉树,或者说堆的本质就是一颗完全二叉树,满二叉树是特殊的完全二叉树。堆的性质就代表了堆基本不会用到头插头删,所以我们通常会利用数组来存放元素,同时堆的大小会发生变化,就需要用到动态内存开辟的数组。这样可以快速拓容也不会很浪费空间,我们是将这颗完全二叉树用层序遍历的方式储存在数组里的。小堆的定义是在整个堆中,任意一个的根节点的值都要小于它的子节点的值。这就是一个小堆,所有根节点的值永远比左右子树的小,那么就可以看出,整棵树的根节点,他的值是整个堆中最小的。
2024-04-29 20:58:41
942
3
原创 栈和队列(Stack & Queue)
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队头(Front):允许删除的一端,又称队首。队尾(Rear):允许插入的一端。空队列:不包含任何元素的空表。
2024-04-17 16:28:11
1440
原创 【数据结构】带头双向循环链表(小白作品,如果有误,请大佬指点)
接着cur用phead->next赋值的原因是,phead传过来的是哨兵位的头节点,它的下一位才是链表真正的头节点(有数据域),接着遍历链表,当cur指针回到哨兵位时,遍历结束。这里也是能看见是报错了的,并且能够直接看出来是在list.c文件的第75行出的问题,如果再看一次实现函数的代码的话,确实就能看见是75行的assert报的错误。链表的初始化就是要创建哨兵位的头节点,此头节点不存储有效数据,并且因一开始不知道指向谁,所以根据双向链表循环的特性,就让该结点的两个指针自己指向自己。
2024-04-10 11:27:57
1086
1
原创 C语言,简易扫雷游戏制作
这个函数是将创建好的二维数组进行初始化,因为要创建两个数组,所以初始化的值也不一样,所以增加了一个初始化的变量。这个函数的功能是将创建好的二维数组打印出扫雷需要的一部分并且在行列标上序号,方便游玩。test.c主要是作为一个整体的框架,详细的功能是由关于游戏的函数来完成的。game.c用来完成游戏需要的函数;game.h用来声明游戏需要的函数。接下来介绍整个程序中代码量最多的game.c。这个函数用来生成雷的数组里面的随机雷的位置。game.c是用来定义数字和声明函数的。判断扫的雷附近的个数。
2024-02-02 11:11:20
365
原创 初识C语言(第一篇博客)
还有两个比较特殊的转义字符'/ddd'和'/Xdd'第一个的意思是将ddd三个八进制数字转换成十进制数字,第二个的两个d都是十六进制,这个转义是将两个十六进制的数字转换成十进制数字。例如'n'字符在前面加上'/'变成'/n'意义就变成了换行,而加上'//'两个斜杠是将转义取消,让斜杠'/'能。用" "双引号括起来的内容就是字符串,而在字符串的结束部分会有一个/0,来表示字符串的结束;转义字符就是在原来的字符前面加上一个/,来转变字符原本的意思。知道了字符是以二进制的方式存储在内存当中的;
2024-01-21 20:17:56
414
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人