- 博客(52)
- 收藏
- 关注
原创 远程连接服务器失败:恶意进程利用 kswapd0 占用超高 CPU
云服务器CPU占用率异常高达99%-100%,经排查发现kswapd0进程异常活跃且存在可疑网络连接。通过分析发现一个伪装成内核线程的恶意进程(PID 2757083)通过memfd加载恶意代码,并与外部IP建立连接。该进程疑似利用Redis服务漏洞入侵,在/tmp目录驻留并建立恶意通信。解决方案包括立即终止该进程,并修改Redis配置仅监听本地回环地址(127.0.0.1)以加强防护。最后需重启Redis服务使配置生效,防止再次被攻击。
2026-04-27 18:01:10
379
原创 运行时,无法链接到动态库?(error while loading shared libraries)
摘要: 用户运行程序时出现动态库 libelasticlient.so.2 找不到的错误。检查发现库文件实际存在于 /usr/local/lib,但 LD_LIBRARY_PATH 未设置且动态库缓存可能未更新。通过 ldd 分析发现依赖库 libjsoncpp.so.19 和 libcpr.so.1 未被正确加载。执行 sudo ldconfig 更新动态库缓存后,依赖关系恢复正常,问题解决。根本原因是系统未自动扫描 /usr/local/lib 路径,需手动更新缓存以正确加载动态库。
2026-04-14 10:58:28
225
原创 监听地址和绑定地址的关系
网络服务绑定与监听地址解析 绑定地址是服务启动时指定的网络接口IP,决定了服务在哪个接口接收数据。绑定地址必须是主机已配置的有效IP,否则服务无法启动。绑定到127.0.0.1时仅接受本机连接,通过本地回环接口实现;绑定到0.0.0.0则监听所有接口;绑定特定IP则只接收该地址的连接请求。监听地址是运行时的概念,指服务实际接收连接的IP+端口组合。服务必须成功绑定后才能监听对应地址,二者本质相同,只是分别描述配置和运行状态。特别注意端口独占性,当服务绑定到0.0.0.0时,其他服务无法绑定该端口的任何具体I
2026-04-14 10:38:04
355
原创 etcd 显示连接失败
根本原因是 缺少 --advertise-client-urls 参数。通过补充该参数(与 --listen-client-urls 一致)即可解决。修改后务必重启服务并验证日志和连接性。
2026-04-03 18:01:39
441
原创 Redis 服务启动失败
这是Redis启动失败的常见原因。特别是在Ubuntu系统中,默认配置 文件可能绑定了IPv6地址(::1),而系统禁用了IPv6,导致启动失败。对此,AI 给出的回答是修改一下 redis 的配置文件,但经过查看,发现配置文件中已经存在 AI 说要添加的内容了。经过实验,发现尽管创建了目录,但一旦启动 redis 服务,该目录就会被删除,仍旧不存在。从日志来看,Redis 启动时遇到了 RDB 文件损坏的问题,导致服务崩溃。后,Redis 仅尝试绑定 IPv4,避免了 IPv6 相关的问题。
2026-03-28 23:19:19
470
原创 错误:执行 make 指令时,发现执行的指令和 Makefile 文件中的不同
摘要 在Makefile编译过程中出现链接错误,原因是all目标与下方指令不匹配。原Makefile中定义的编译指令包含多个动态库链接选项(-lgflags、-lspdlog等),但实际执行的命令缺少这些选项,导致链接失败。通过修正Makefile,使all目标与编译指令保持一致后,程序成功编译运行。该问题展示了Makefile中目标与指令匹配的重要性,确保编译命令能正确包含所有必要的链接库选项。
2026-03-08 23:15:55
41
原创 二分查找算法模板
本文介绍了二分查找的两种常用模板:查找右序列左端点和左序列右端点。通过分析分段原理、循环条件和边界移动规则,详细解释了如何正确处理查找目标值在序列中出现多次或不存在的情况。文章重点阐述了中间值计算的不同方式及其影响,并针对序列中不存在查找值的情况给出了处理方法。该模板适用于有序数组的高效查找,时间复杂度为O(log n),能够正确处理各种边界情况。
2026-03-07 17:44:59
393
原创 ERROR: AddressSanitizer: heap-use-after-free on address 0x502000000078 at pc 0x55b9ce843756 ...
摘要:在链表操作中,使用priority_queue排序节点后重新连接时,发现程序异常终止。经排查发现是最后一个节点的next指针未置为nullptr,导致链表形成环状结构。通过打印链表输出确认问题根源,修正后将尾节点next置空后问题解决。关键点在于处理链表连接时需确保尾节点指针正确初始化。
2025-08-17 17:07:05
211
原创 python 中 logging 模块的使用详解
上面我们直接调用等方法时,实际上使用的是logging模块内部维护的根 logger(root logger),这是一个类的实例,代表一个独立的日志记录器。直接使用根 Logger 的缺点是配置可能很麻烦,因为依赖于单个。对于较大的项目,我们需要更大的灵活性来满足日志记录需求。
2025-07-20 17:03:39
800
1
原创 LNK2019:无法解析的外部符号 “class std::basic_ostream ...(template 的声明)
为什么类外实现的成员函数每次都要 template ?模板的友元的声明为什么要写 template ?类成员函数成为函数模板,使用时有什么区别?一次 template 可以控制的范围有多大?
2024-09-23 20:57:39
780
原创 修改 Visual Studio 的主题颜色、背景颜色、字体
主题颜色,代码区颜色,字体,字体大小可以在工具栏中的【工具】->【选项】中修改。
2024-09-21 10:40:52
12955
原创 线程 - 线程优缺点、线程自有和共享的数据、多线程使用公共空间、线程分离、线程库对线程的管理
在上面的【四、2. 线程自有的数据】部分,我们提及了线程有独立栈结构,现在我们看到它了, 线程的栈结构是在库中维护的,每个线程都有自己的独立栈结构,主线程使用的是地址空间中的栈空间,叫主线程栈。多线程切换有成本,像上面的计算密集型应用,线程过多可能会有较大的性能损失(增加了额外的同步和调度开销,而可用资源不变)。而进程创建的时空成本是较高的,有各种数据结构的创建,数据的加载。让两个线程进同一个线程函数,打印同一个临时变量的地址,是不一样的,说明使用的是不同的栈结构。而线程占用的都是一份的。
2024-09-18 23:40:36
1354
原创 报错 - undefined reference to `main‘
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':(.text+0x24): undefined reference to `main'collect2: error: ld returned 1 exit statusmake: *** [makefile:2: test] Error 1错误
2024-09-16 20:21:04
1207
原创 线程 - 线程的由来、进程和线程的关系、线程创建_等待_退出详解
但线程的库可不是必须的,用不到线程部分的程序在编译时就不需要链接原生线程库,你用线程的才需要这个库,所以既然不是必须的,那就交给用户手动链接了。我们的代码在进程中,全都是串行调用的,创建进程,是为了多执行流并发执行,所以创建进程和创建线程都可以,但是显然创建一个线程的成本要低得多啊!的设计者认为,进程和线程都是执行流,有很高的相似性,没必要单独设计数据结构和算法,可以直接复用代码,使用进程来模拟线程。所以线程算是包含在进程中的。的线程模块是复用的进程的,而也有单独设计线程模块的系统,这个系统叫。
2024-09-14 17:30:02
1328
原创 文件系统 -文件的基本了解
每种硬件都用统一的结构体对象描述,这样就可以统一的管理这些硬件了,将这些对象使用某种数据结构链接起来,对这些硬件的管理就可以转变为对数据结构的增删查改了。那么,一个进程是可以打开多个文件的,一段时间内,系统中又会有很多进程,所以系统需要将这些进程打开的文件进行管理,方法是:先描述,后组织。所以按照文件是否被加载到内存中,可以将文件分类:内存文件(被打开的),磁盘文件(未被打开的)。如果要打开的文件存在就打开,不存在就创建一个再打开,然后将文件内容清空,再写入内容。文件中写了些什么,就属于文件的内容了。
2024-08-26 19:03:16
1163
原创 表达式求值 - 整形提升和截断
为了获得这个精度,表达式中的字符类型和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。截断和整形提升一般会同时出现,而且很容易被忽略,下面通过一个示例来具体了解一下截断和整型提升。截断指的是长字节类型在转换成长字节类型时,进行的取部分比特位的现象。为了方便描述,将上面的几行代码进行了标号,下面我们一部分一部分的看。C语言的整形算数运算总是至少以缺省整形类型的精度来进行的。进制数字,但此时我们得到的值的补码,要想得到。类型的,所以赋值时由于类型转换会发生的截断。截断是对补码进行的操作,而。
2024-08-21 17:53:24
891
原创 make/Makefile - ACM 时间及 make 的检查更新
一个可执行程序需要多个源文件链接,编译链接文件后形成了可执行程序,但后面修改了几个源文件,需要再次编译链接形成一个新的可执行程序,但再次编译时,它会只编译那几个改动过的源文件,形成新的。某个源文件中代码有点问题,运行结果出错,改动后,重新编译后运行仍然出错,可能是因为没有很好的识别时间(文件多)/其他问题,导致仍然链接的是旧的。修改时间(Modify)指的是对文件的内容进行了修改后,紧跟着更新的时间。的新了,此时不再显示是最新状态了,可以重新编译了,所以对比的其实是。从之前的图片中,我们也能看到当使用。
2024-08-19 16:22:15
1092
原创 类和对象 - 构造函数
month = 1;_day = 1;_day = day;int _month;int _day;从上述可见,构造函数可以重载。🥝Date d1;Date d1();// 错误无参调用不可以带括号,因为这样的话,就无法与函数声明分开了,这个调用可以看作名为d1的函数的声明,返回值是Date。🧩。
2024-08-18 11:19:00
1075
原创 make/Makefile -基本使用
e执行一条指令时,先看当前的依赖方法,依赖方法没有办法实现的话,会递归向下,直到能够完成最初的依赖方法,再逆向执行依赖方法,这属于一条指令。是在自己当前目录下需要手动构建的一个文件,保存的是依赖关系和依赖方法。文件的,默认形成的是第一个目标文件,所以第一个可以直接使用。自动将各个源文件编译,然后链接了,不用我们操心了。这个的依赖文件列表为空,不需要依赖任何文件。在开头定义,且等号左右不能加空格,使用时用。文件,然后全部链接,形成一个可执行程序,形成目标文件的时候,默认是从上到下扫描。
2024-08-17 21:34:56
2070
原创 环境变量 - main()函数和命令行参数
给我们打印出来的命令行字符串,起提示作用,提示我们在此处输入命令,然后是。因为想要通过不同的选项,让同一个程序执行它内部的不同代码,从而实现不同功能。函数是有参数的,虽然现在我们一般不写,但它是可以有的。本文到这里就结束了,如果对您有帮助,希望得到一个赞!是硬性要求,所以几乎所有的语言都要支持命令行参数。函数,通过不同的选项就可以执行不同的命令了。数组中的内容跟我们在命令行输入的内容有关。等指向的是选项,要注意一点的是该表必须以。指向的字符串是路径+可执行程序,而。则是表示该数组中元素的个数。
2024-08-17 17:09:55
438
原创 vim - vim模式及部分操作
vim是一款多模式的编辑器。vim中有很多子命令来进行代码的编写操作。同时,vim提供了不同的模式供我们选择。在vim下的底行模式下通过可以查看所有模式。linux下的部分模式如下:总计12种模式,6种基本模式,6种新增模式。
2024-08-16 12:20:46
610
原创 进程 - 进程状态总览
本文到这里就结束了,如果对您有帮助,希望可以得到您的一个赞,如果错误,欢迎指正。会被操作系统变迁到不同的队列(运行队列,等待队列)中。阻塞状态是一种什么状态呢?下面通过一张图来认识一下。所以,正如前文所说的:状态的改变引起的是进程的。是指将进程信息写入到外设中,当使用时再写入进来。是一种在计算机资源比较吃紧时会出现的状态。当内存资源吃紧时,将阻塞进程的代码和数据。,或内存大小,不能超过内存大小的二倍。R状态:已经准备好随时被调度了。当需要运行程序时,将代码和数据。
2024-08-09 21:31:47
346
原创 Linux 下的进程状态
本文到这里就结束了,如果对您有帮助的话,可以给个赞支持一下哦,如果有哪里有错误,欢迎指正。):僵尸状态,进程已经执行完毕,但并未获得进程退出的相关信息时的状态。有些进程被禁止做某些操作,但如果进程硬要这样干,进程就会被暂停。会自动读取,所以我们没有手动读取程序的结束信息也没有内存泄露。一般父进程是不会自动读取子进程的结束信息的,但。而大部分进程都会与外设有关,会有等待的状态。都会维护一个自己的运行队列(一个。信号进行进程的手动暂停和继续。:进程已经准备好随时被调度了。
2024-08-09 20:32:10
1101
原创 C++ - 模板
中class可以用typename代替。推演实例化:Swap(a,b);Swap(c,d);不能推演成两个类型:显式实例化:int(a,b);//类模板示例public:和是不同的类型,显示实例化的类型不同,他们就是不同的类。当编译器遇到一个模板定义时,不会生成代码,只有在遇到实例化语句时,才根据模板定义生成实例代码,此时,编译器需要知道模板的定义。(后面有详细说明)类内:跟没有模板的类没有区别class A。
2024-06-13 21:12:19
661
原创 浮点型在内存中的存储
本文到此就结束啦,如果有帮助到您,希望可以得到您的一个赞!因为任意一个二进制浮点数都可以表示成上述形式,所以存储一个浮点数,只要存。这样做的目的,是节省1位有效数字,多一位来放小数部分,精度会提高。在转为二进制时,因为小数权重的原因,可能永远没法碰巧凑为。所以,为了解决这个问题,IEEE 754规定,存入内存时。浮点数有两种表示方法,一种是直接写出来的小数,如。的正负,都要加中间数,只是这种操作是为负数的。,小数点可以移动,所以叫浮点数。可以看到,二进制整数部分的权重是,,因此可以被舍去,只保存后面的。
2024-06-13 19:07:08
1365
原创 C2065:“_tables”: 未声明的标识符
说明不是该类型的问题,而是中间过程有错误,导致查找时,无法查到末尾的 vector ,所以识别不了前面用到的 _tables。仔细检查发现是类中有一个函数语法有错误,改正后,错误解决。在实现哈希表时,HashTable 类中有定义成员变量。,但是VS显示识别不了这个符号。
2024-06-11 10:45:56
197
原创 C3892 “_Hole”: 不能给常量赋值
是由于对 vector 作了限制,vector 是无法被修改的,而。使用 sort() 给 vector排序时出现这个问题。
2024-04-28 17:56:10
278
原创 类和对象-类基础详解
分离:指的是成员函数定义写在了类外;注意要在函数前标明类域。未分离:指的是成员函数直接在类中定义;默认直接在类中定义的函数是内联函数。正确的用法:短小的函数可以直接在类内定义,较长的函数就声明和定义分离。🍃开空间的地方是定义,言明类型的是声明。!!🧡。
2024-01-14 00:40:10
1041
1
原创 程序环境详解(翻译环境)
程序环境包括翻译环境和执行环境。计算机可以识别二进制指令,而我们写的代码时文本信息,计算机无法识别,需要翻译环境进行翻译后,计算机才能识别运行。执行二进制指令。
2023-09-18 11:16:01
513
原创 C语言函数详解
与库函数的区别就是,函数的名称,形参,返回值类型都可以自己定义。(自己的函数,想叫什么名字叫什么名字,想设置几个参数就设置几个参数)传递给函数数据,不改变实参传递给函数地址,可以改变实参看是否需要改变实参的值,需要改动就定义址传递函数,不需要就定义值传递函数。函数定义:创建某个函数。(盖房子)函数调用:使用某个函数。(住进房子里)函数嵌套定义:在一个函数中定义一个函数。该代码是在 main() 函数中,定义了一个名为 hell() 的函数。
2023-07-03 23:09:33
5179
2
原创 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水
empty 经过处理后是手里剩下的瓶子数(因为加了 %2 的瓶数)并不等于实际上这次喝的汽水数,所以结果会错误。当我们的钱数为 20 元时,最多是喝到 39瓶汽水的。
2023-06-04 18:36:51
325
原创 strlen()函数的实现,应用:求字符串长度,字符(数字)数组内数组个数
所以,在 ret 计数了一个之后,会往后走一步,走 1 个字节,走到第二个紫色格子处,而第二个紫色格子里放的是0,(因为每种颜色的格子是一个 int 变量的 4 个字节,即,紫色的 4 个格子是 c1[0] 的 4 个字节,而 c1[0] 是 1,1 占用不了全部的 4 个字节,只占用了 1 个字节,所以后三个紫色格子是0),strlen()碰到 0 就结束计数了,所以打印出来的结果是 1。当 c1[0] 数字足够大的时候,分配给它的 4 个字节里都不会是 0 了,此时用 strlen()就不会是 1了。
2023-05-30 20:15:25
2003
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅