自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Docker】一文看懂docker run的使用方法

Docker 提供了多种网络模式,例如 bridge、host 和 overlay 等。在容器启动时,可以通过--network选项指定网络模式。bridge(默认模式):容器之间通过 NAT 网络隔离。host:容器和主机共享同一个网络栈,这使得容器中的服务可以直接使用主机的 IP 和端口。此时,容器中的 Nginx 服务会与主机共享网络。还可以通过创建自定义的网络,容器可以通过该网络进行互联。

2024-09-17 12:48:17 1180

原创 【C++】一文带你彻底了解构造函数

构造函数是一种特殊的成员函数,它在对象创建时自动调用,用于初始化对象的成员变量。其名称必须与类名相同,且没有返回类型(即使是void也不能)。public:// 构造函数的主体,用于初始化操作当对象被创建时,构造函数MyClass()会自动执行。一旦用户定义了带参数的构造函数,编译器将不会提供默认构造函数。public:// 显式声明默认构造函数C++ 构造函数是对象初始化的核心机制,通过不同类型的构造函数(默认、带参数、拷贝、移动)实现对象的多样化创建方式。

2024-09-17 12:41:46 676

原创 【Linux网络】Socket套接字

Socket是一个双向的通信端点。它允许一台计算机的程序与另一台计算机的程序进行数据传输。TCP (传输控制协议):提供可靠的、面向连接的通信服务。TCP连接像一个虚拟的电路,两端通过Socket进行数据传输,确保数据包按顺序到达。UDP (用户数据报协议):提供无连接、尽力而为的通信服务。与TCP不同,UDP没有建立连接过程,数据包可能会丢失或乱序,但它更快,适合对时延敏感的应用场景。

2024-09-12 23:18:54 764

原创 【C++】用C++在Linux环境下实现简单的Web服务器

Web服务器的核心任务是处理客户端发来的HTTP请求并返回HTTP响应。实现这一功能的第一步是理解网络套接字。套接字是一种允许程序与网络通信的机制。以下是用C++编写一个简单Web服务器的基本框架。你可以通过浏览器访问。服务器启动后,将监听。

2024-09-12 23:16:20 714

原创 【C++】C++ 多态的底层实现原理

多态指的是同一操作在不同对象上具有不同的表现。编译时多态(静态多态):如函数重载、运算符重载,通过编译器在编译时决定调用哪个函数。运行时多态(动态多态):主要通过继承和虚函数实现,调用函数时根据实际对象的类型动态决定调用哪个函数。本文重点讨论运行时多态,它是通过虚函数机制实现的。

2024-09-11 22:26:02 1178

原创 【C++】new的底层实现原理

new的底层原理

2024-09-11 22:20:55 984

原创 【Linux】可重入与线程安全的联系与区别

虽然可重入函数通常是线程安全的,但线程安全的函数未必是可重入的。例如,某个函数使用了锁来确保线程安全,但它在执行时持有锁,这就意味着它不能在信号处理程序或中断中被安全调用,因此它不是可重入的。的函数是指能够在被中断后,再次从头开始执行而不会影响其正确性的函数。换句话说,如果在一个可重入函数的执行过程中,出现了新的调用(无论是来自同一线程还是另一个线程),函数的执行仍然是正确的。是两个重要概念,它们都与程序在多线程环境下的正确性有关。指的是代码能够在多个线程并发访问的情况下仍能保持正确的行为。

2024-09-10 21:06:22 1032

原创 【Linux】线程安全问题

在多线程编程中,线程安全(Thread Safety)是指程序在多个线程同时执行时,能够正确地共享和访问资源而不出现数据不一致或竞争条件的情况。线程安全的代码确保多个线程在没有同步机制的情况下不会破坏数据或引发意外行为。

2024-09-10 20:56:46 778

原创 【Linux】 Linux 死锁

死锁指的是多个进程或线程因为互相等待对方持有的资源,导致这些进程或线程都无法继续执行的情况。死锁的典型场景是线程 A 锁住了资源 X,并等待资源 Y,而线程 B 锁住了资源 Y,并等待资源 X。由于双方都在等待对方释放资源,最终进入僵局。

2024-09-08 22:17:49 1153

原创 【Linux】Linux 可重入函数

简单来说,可重入函数是线程安全的函数。当函数正在执行时,如果它被其他线程或中断再次调用,它能够正确处理这种情况。不使用静态或全局变量,或仅使用局部变量。不依赖非线程安全的库函数,如malloc或strtok。不修改输入参数。如果函数需要访问共享资源,则必须使用同步机制(如锁或信号量)来避免竞态条件。

2024-09-08 22:15:30 1063

原创 【Linux】Linux 共享内存:高效的进程间通信

共享内存是一块可以被多个进程同时访问的内存区域,允许不同进程读取和写入同一份数据。每个进程都可以直接访问这块内存,不需要通过管道、套接字或消息队列进行数据传输。这种直接访问的特点使得共享内存成为最为高效的进程间通信机制之一,适用于需要频繁交换大量数据的场景。

2024-09-07 21:01:33 1214

原创 【Linux】Linux 管道:进程间通信的利器

管道是一个双端的通信通道,其中一端用于写数据,另一端用于读数据。它是 Linux 系统中最简单且常用的进程间通信方式之一,尤其适合父子进程之间的数据传递。数据从管道的一端写入,另一端读取,保证了进程之间的同步与协作。

2024-09-07 20:59:03 691

原创 【C++】main函数是怎么开始的呢?

当一个 C++ 程序启动时,操作系统负责加载可执行文件并将控制权移交给程序。操作系统加载可执行文件:操作系统将可执行文件加载到内存,并设置程序的堆栈指针等。调用启动例程(Startup Code):在调用main函数之前,程序会首先执行启动代码,这个启动代码由编译器或标准库提供,通常称为_start函数。它负责为程序的执行做准备。初始化全局/静态变量:C++ 中,全局变量和静态变量的初始化在main函数之前进行。编译器生成的启动代码会负责这些变量的初始化。对于构造函数,需要先调用构造函数初始化对象。

2024-09-05 16:38:22 979

原创 【C++】使用switch时应注意的一些细节

之间的 fall-through,但不推荐在不需要的地方省略。时,代码会变得难以维护。,这能提高程序的健壮性,避免出现无法预测的情况。如果不使用大括号,可能会出现变量冲突问题。标签后定义变量时,必须显式用大括号。:C++17 之后,允许显式使用。包裹其作用域,以避免变量名冲突。标签过多或需要处理复杂的逻辑时。分支,以处理所有未明确列出的。这种写法简洁有效,避免重复代码。:如果需要检查范围,可以用。标签后,通常需要一个。也可以增加代码可读性。),也不支持字符串类型。,不能是范围或变量。

2024-09-05 16:33:16 610

原创 【C++】static作用总结

局部静态变量:跨函数调用保持值,生命周期为整个程序运行期。类静态成员:类级别的共享成员,可以不通过实例访问。文件静态变量/函数:限制变量和函数的作用域到定义它的文件中,避免外部访问。

2024-09-05 16:29:59 453

原创 【Linux】深入理解Linux文件系统中的inode

inode(Index Node)是Linux文件系统中的一种数据结构,用于存储文件的元数据(metadata),例如文件的大小、权限、所有者、创建时间等。每个文件和目录都对应一个唯一的inode,文件系统通过inode来管理和访问文件的相关信息。需要注意的是,inode不存储文件的实际数据内容,它只包含指向数据块的指针,而数据块中才存储了文件的实际内容。inode在Linux文件系统中扮演着关键角色,负责管理和访问文件的元数据。理解inode。

2024-09-04 22:57:23 1407

原创 【Linux】理解Linux中的软链接与硬链接

硬链接是指多个文件名指向同一个数据块。每个硬链接都拥有相同的inode号,即它们实际指向的是相同的物理存储位置。相同的文件数据:硬链接文件与原始文件共享相同的数据块,因此它们的内容完全一致。共享inode号:硬链接与原始文件共享相同的inode号,这意味着它们是同一个文件的不同引用。删除影响:只有当所有硬链接和原始文件都被删除时,数据块才会被释放。如果删除一个硬链接或原始文件,其他硬链接仍然能够访问文件数据。同一文件系统:硬链接只能在同一个文件系统内创建,因为它们直接指向文件的inode。

2024-09-04 22:53:09 744

原创 【C++】C++智能指针详解

程序员可以有效地管理内存的分配与释放,减少内存泄漏的风险,并在需要时打破循环引用。掌握智能指针的使用是现代C++编程的基础,这不仅能提升代码的健壮性,还能使代码更加易于维护。C++中的智能指针是现代C++编程中管理动态内存的关键工具。这样,开发者无需手动管理内存的释放,大大降低了出现内存泄漏的风险。被销毁时,才会释放对象的内存。是一种共享所有权的智能指针,可以让多个指针同时指向同一个对象。如何共享对象的所有权,并通过引用计数来管理对象的生命周期。不会影响对象的引用计数,因此它不会阻止对象的销毁。

2024-09-03 21:38:49 631

原创 【C++】C++ I/O流详解

C++的I/O流(输入/输出流)为处理输入和输出操作提供了一种强大且灵活的方式。它们是C++标准库的一部分,能够让程序从不同的来源读取数据并向各种目的地写入数据,比如控制台、文件,甚至是内存缓冲区。在C++中掌握I/O流的使用,对于高效地处理数据输入输出至关重要。默认情况下,C++的输出流是带有缓冲区的。C++的I/O流基于“流”的概念,流可以理解为数据从输入设备(如键盘、文件等)到程序或从程序到输出设备(如屏幕、文件等)传输的途径。文件流是C++中另一个常用的I/O操作类型。,并最终显示在屏幕上。

2024-09-03 20:59:18 612

原创 【C++】C++中的特殊类:懒汉模式与饿汉模式

单例模式(Singleton Pattern)是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。通常用于管理全局状态、资源或配置信息。单例模式的关键在于控制实例化的时机和方式,而懒汉模式和饿汉模式则分别代表了不同的实例化策略。懒汉模式和饿汉模式是单例模式的两种常见实现方式,各有优缺点。在C++中,选择哪种模式应根据实际需求和使用场景来决定。懒汉模式通过延迟加载节省资源,但需要处理线程安全问题;饿汉模式实现简单且线程安全,但可能会导致不必要的资源占用。

2024-09-02 21:18:03 887

原创 【C++】C++ 多态的底层实现

C++通过虚函数和虚表实现了强大的多态性机制,允许程序在运行时动态地决定调用哪个函数。这种机制虽然引入了一定的内存和性能开销,但在面向对象编程中提供了极大的灵活性。理解其底层实现对于编写高效、健壮的C++代码具有重要意义。

2024-09-02 21:15:42 1489

原创 【C++】探索C++中的异常处理:`try-catch`的使用与最佳实践

在程序执行过程中,可能会遇到各种异常情况,比如除零错误、内存分配失败或文件无法打开等。这些异常情况如果不加以处理,可能会导致程序崩溃或行为异常。C++通过异常处理机制,允许程序在异常发生时捕获并处理这些错误,从而避免程序崩溃。不要在catch块中捕获所有异常,除非你有充分的理由。捕获特定的异常类型能够帮助你更好地理解和处理错误。

2024-09-01 16:45:20 1281

原创 【C++】深入理解C++模板:从基础到进阶

模板是C++中用于泛型编程的工具。它允许你编写可以处理任意类型的函数和类,而不必重复编写相似的代码。函数模板和类模板。

2024-09-01 16:42:17 694

原创 【Linux】理解动态库与静态库:编程中的两种关键库

静态库(Static Library)是指在编译时被嵌入到可执行文件中的库。它通常以.a(在 Unix/Linux 系统中)或.lib(在 Windows 系统中)为扩展名。在程序编译期间,静态库的代码被复制到每一个使用它的可执行文件中,因此,最终生成的可执行文件是一个独立的、完整的二进制文件。动态库(Dynamic Library),也称为共享库(Shared Library),是在程序运行时加载的库。它通常以.so(在 Unix/Linux 系统中)或.dll(在 Windows 系统中)为扩展名。

2024-08-30 23:39:37 1549 3

原创 【Linux】 理解 Linux 中的 `dup2` 函数

dup2dup2是一个强大且灵活的系统调用,可以在文件描述符管理中发挥重要作用。无论是重定向标准输入/输出,还是在进程间通信中创建管道,dup2都是一个不可或缺的工具。通过熟练掌握dup2,你可以更有效地控制程序的 I/O 操作,从而编写出更加健壮和高效的应用程序。

2024-08-30 23:35:53 1526

原创 【Linux】深入探讨Linux进程等待:`waitpid`与`wait`

wait是一个用于等待任一子进程终止的系统调用。父进程调用wait后会被挂起,直到它的某个子进程终止,操作系统会将子进程的退出状态返回给父进程。如果没有子进程,wait会立即返回。status:用于存储子进程的终止状态。如果不关心子进程的退出状态,可以将其设置为NULL。正常返回时,wait返回终止的子进程的PID;如果出错,返回-1,并设置errno来指示错误原因。

2024-08-29 11:02:39 1287

原创 【Linux】进程等待详解:概念、类型与优化策略

进程等待是指进程在执行过程中因某些条件未满足而暂时停止执行的状态。这些条件可以是等待输入/输出操作完成、资源可用、某个事件发生等。进程等待在多任务操作系统中尤为重要,因为它有助于提高系统资源的利用率。

2024-08-29 10:59:08 725

原创 【C++】new和定位new

new和定位new

2024-08-28 17:29:22 392

原创 【C++】一文看懂 C++ 多态:动态与静态多态的全面剖析

多态来源于希腊语,意为“多种形态”。在编程中,多态性指的是在相同的接口下,不同的数据类型可以表现出不同的行为。编译时多态和运行时多态。编译时多态通过函数重载和运算符重载实现,允许在编译阶段确定具体的函数调用。运行时多态通过虚函数和继承实现,允许在运行时根据对象的实际类型确定具体的函数调用。多态性极大地提高了代码的灵活性和可维护性,是面向对象编程中不可或缺的组成部分。

2024-08-27 13:54:47 1253

原创 【C++】避开 C 语言的格式化输出陷阱:掌握 printf、sprintf、snprintf、fprintf、vsprintf

printf:用于标准输出。sprintf:用于将格式化字符串写入字符数组。snprintf:类似于sprintf,但提供了安全的缓冲区大小控制。fprintf:用于将格式化字符串写入文件。vsprintfvsnprintfvfprintf:用于处理变长参数列表的变体。理解这些函数的不同用途及其安全性考量是高效、稳健的 C 语言编程的基础。掌握它们,您将在编码过程中更加得心应手。

2024-08-27 13:50:48 1179 1

原创 【Linux】exit和_exit的区别

exit()是C标准库中的一个函数,用于正常终止一个进程,并将一个状态码返回给操作系统。它的原型定义在status参数表示进程的退出状态,一般约定0表示成功退出,非零值表示失败或其他状态。exit()调用注册的清理函数在进程的生命周期中,可以通过atexit()函数注册多个清理函数(处理程序),这些函数会在exit()调用时按注册的顺序逆序执行。刷新I/O缓冲区exit()会刷新所有打开的输出流缓冲区,确保所有未写入的数据被写入到对应的文件或终端中。关闭所有打开的文件描述符。

2024-08-26 20:22:59 996

原创 【Linux】写时拷贝详解

写时拷贝是一种优化内存资源的技术。其核心思想是:在有多个进程或线程需要共享同一块数据时,操作系统会允许它们共享同一个数据块的副本,而不是为每个进程分配独立的内存空间。只有当其中一个进程尝试修改数据时,系统才会实际进行数据的拷贝,为该进程创建一个独立的副本。这种延迟拷贝的策略大大减少了不必要的内存占用。写时拷贝是一种高效的内存管理技术,通过延迟实际的数据拷贝操作,优化了系统的内存使用和性能。在进程创建、虚拟化以及现代文件系统中,写时拷贝都得到了广泛应用。

2024-08-26 20:15:29 512

原创 【Linux】并发与并行:理解多任务处理的核心概念

并发指的是在同一时间段内处理多个任务的能力。并发并不意味着同时执行多个任务,而是指任务之间的切换。操作系统通过时间分片、进程或线程调度等方式,使多个任务看起来像是“同时”进行的。示例:一个简单的例子是你在烹饪时,同时烧水、切菜和炒菜。尽管你不能同时完成所有这些操作,但你可以在烧水的间隙切菜,在切菜的间隙炒菜,最终完成所有任务。并发的关键:并发更关注任务的调度和协调,而非真正的同时执行。即使在单核 CPU 上,也可以通过快速切换任务来实现并发。并行指的是在同一时刻真正地执行多个任务。

2024-08-25 16:56:54 679

原创 【Linux】理解操作系统中的进程状态:阻塞、挂起、运行

在现代操作系统中,进程(Process)是一个正在执行的程序实例。为了有效管理进程,操作系统会将每个进程分配到特定的状态。这些状态表示进程当前的活动情况,并帮助操作系统决定如何调度和分配系统资源。创建(New):进程正在创建中。就绪(Ready):进程已准备好运行,等待 CPU 的分配。运行(Running):进程正在占用 CPU 执行指令。阻塞(Blocked):进程正在等待某些事件(如 I/O 操作)完成,无法继续执行。挂起(Suspended):进程被暂时移出内存,停止执行。

2024-08-25 16:52:46 1081

原创 【C++】深入理解C++继承:从基础到高级

继承(Inheritance)是C++中类与类之间关系的表现形式之一。通过继承,一个类可以获得另一个类的所有属性和方法。被继承的类称为基类(Base Class)或父类(Parent Class),继承它的类称为派生类(Derived Class)或子类(Child Class)。public:// 基类的成员函数public:// 派生类的成员函数在上面的例子中,继承自BaseClass,因此它不仅拥有自己的成员derivedVar和,还继承了BaseClass中的成员baseVar和。

2024-08-24 16:52:53 817

原创 【Linux】什么是虚拟内存?

Linux虚拟内存(1)什么是虚拟内存?(2)虚拟内存的工作原理(3)虚拟内存的优点(3)Linux中的虚拟内存管理工具总结虚拟内存是一种内存管理技术,它允许操作系统通过创建一个虚拟的地址空间来模拟比实际物理内存更大的内存容量。操作系统将程序所需的内存分为多个小的内存块(称为页面),并且这些页面可以分布在物理内存和磁盘的交换空间(swap space)中。地址空间的分离:每个进程在虚拟内存中的地址空间是独立的。这意味着一个进程无法直接访问其他进程的内存,这增强了系统的安全性。分页。

2024-08-24 16:49:36 1378

原创 【Linux】IP地址和MAC地址

MAC地址是用来识别数据链路层中相连的节点。它的长度为48位比特位,也就是6字节。MAC地址是具有唯一性的,它的唯一性是在网卡硬件生产时就已经制定,所以一个网卡一个MAC地址。这就意味着,一台主机如果有多个网卡,那么就有多个MAC地址。

2024-08-23 22:25:39 552

原创 【boost_search】3.为什么去标签和解析文件的代码框架

我们之前获取的源数据都是html数据,在一个html中我们看到在一个html中,我们看到有一些字符是用包起来的,用的就是标签。

2024-08-23 22:24:33 427

原创 【boost_search】2.正排索引和倒排索引

首先,要制作搜索引擎,我们首先要了解,什么是正排索引,什么是倒排索引,这是一个搜索引擎的关键。

2024-08-22 14:17:29 418

原创 【boost_search】1.获取数据源

boost_search项目和百度那种不一样,百度是全站搜索,而boost_search是一个站内搜索。而项目的宏观上实现思路就如同图上的思路。

2024-08-22 14:15:58 500

空空如也

空空如也

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

TA关注的人

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