自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络通信 Posix API的原理与使用

Posix API 是一个为操作系统提供标准化接口的系列规范,旨在确保程序在不同 UNIX 操作系统和兼容系统之间具有可移植性。POSIX API 是一组标准的系统调用和库函数,它们定义了程序与操作系统交互的接口。POSIX API 主要涉及文件操作、进程管理、线程管理、信号处理、网络通信等方面。POSIX 网络 API 是一组标准化的接口,主要用于在 UNIX 和类 UNIX 操作系统(如 Linux、macOS)上进行网络编程。它们允许程序员创建、管理和通信网络套接字。

2024-09-03 14:04:46 1198

原创 调试神器strace的使用

strace 是一个 Linux 系统下的强大调试工具,用于跟踪系统调用(system calls)及其接收的信号(signals)。通过使用 strace,开发者可以观察和调试进程在运行时与操作系统内核之间的交互,这在分析应用程序的性能、调试错误以及理解程序行为时非常有用。strace 是一个非常灵活和强大的工具,熟练掌握它可以大大提高我们在 Linux 系统上的调试能力。

2024-09-03 11:03:11 977

原创 浅析事件驱动Reactor

事件驱动的 Reactor 模式是一种设计模式,广泛应用于高性能网络服务器和 I/O 密集型应用中。它的核心思想是通过事件驱动的方式管理和处理多个并发连接或 I/O 操作,而不需要为每个连接或操作创建单独的线程。这种模式能够极大地提高系统的可扩展性和资源利用效率。

2024-08-26 23:18:57 1148

原创 IO多路复用,select、poll和epoll简介

select、poll 和 epoll 是 Linux 下用于多路复用 I/O(Input/Output)的系统调用,它们用于监视多个文件描述符,以查看哪个文件描述符上有可读、可写或发生了异常的事件。select 适合处理少量文件描述符和需要跨平台支持的场景。它简单易用,但有文件描述符数量限制,并且在文件描述符数量多时性能较差。poll 适合需要监控大量文件描述符的场景。它没有文件描述符数量限制,但在大量文件描述符时性能依然较差。

2024-08-25 23:03:42 953

原创 C++的模板简介

C++的模板(Template)是C++中一种强大的特性,它允许编写泛型程序,即编写不依赖于具体类型的代码。模板提供了一种机制,可以在编译时生成针对不同数据类型的代码,而不需要重复编写相同逻辑的代码。这种机制使得代码更加灵活和可重用。C++模板是一种功能强大且灵活的机制,能够极大地提高代码的复用性和类型安全性。模板的学习曲线较为陡峭,但一旦掌握,它将成为编写高效、通用代码的利器。C++20 的概念进一步增强了模板的表达能力,使得模板编程更加直观和强大。

2024-08-18 23:22:49 963

原创 C++右值引用简介

C++ 的右值引用(rvalue reference)是在 C++11 中引入的,它主要用于实现移动语义和完美转发,极大地提高了程序的性能和灵活性。右值引用是 C++11 中引入的强大特性,主要用于实现移动语义和完美转发。通过右值引用,C++ 可以避免不必要的对象复制,提高程序的性能,特别是在处理大量数据或复杂对象时。掌握右值引用和相关的移动语义对现代 C++ 编程至关重要。

2024-08-18 21:04:16 1428

原创 C++的正则表达式简介

d:匹配任何数字([0-9])。\D:匹配任何非数字。\w:匹配任何单词字符(字母、数字、下划线)。\W:匹配任何非单词字符。\s:匹配任何空白字符(空格、制表符、换行符)。\S:匹配任何非空白字符。

2024-08-18 20:04:25 2803

原创 C++匿名函数lamba简介

Lambda 表达式是 C++11 引入的一个功能,允许你在代码中定义匿名函数(即没有名字的函数)。这种表达式可以用于简化函数对象的定义,并使得代码更简洁。Lambda 表达式特别适用于局部的、一次性的函数对象,如用于 STL 算法中。捕获方式含义[ ]空捕获列表,Lambda不能使用所在函数中的变量.[names]names是一个逗号分隔的名字列表,这些名字都是Lambda所在函数的局部变量。默认情况下,这些变量会被拷贝,然后按值传递,名字前面如果使用了&,则按引用传递[&]

2024-08-18 17:42:33 788

原创 C++智能指针简介

std::unique_ptr:独占所有权,不能复制,支持移动语义。std::shared_ptr:共享所有权,引用计数管理生命周期,支持多次引用。std::weak_ptr:不拥有对象,防止循环引用,弱引用。

2024-08-18 16:41:02 834

原创 C++的Magic Static

C++ 中,函数内部的静态变量只会在第一次执行该函数时被初始化,而且这种初始化在 C++11 标准之后是线程安全的。这意味着即使多个线程同时第一次调用该函数,静态变量也只会被初始化一次,并且在初始化完成前,其他线程会被阻塞,等待初始化完成后再访问该变量。这种特性被称为“Magic Static”。“Magic Static” 是 C++11 之后引入的线程安全静态变量初始化机制,在需要线程安全的惰性初始化时非常有用。通过利用这一特性,可以简化代码,避免复杂的锁机制,实现高效且安全的单例模式或其他类似场景。

2024-08-17 00:01:24 461

原创 C++:std::atomic_thread_fence(std::memory_order_acquire)(内存栅栏(Memory Fence))

std::atomic_thread_fence(std::memory_order_acquire) 是一种用于控制内存操作顺序的工具,确保在多线程程序中,特定的读取操作在内存模型中的顺序是正确的。它通常与 memory_order_release 搭配使用,以确保在读写共享资源时,线程能够正确地观察到其他线程的写入操作,从而避免竞态条件和数据不一致问题。

2024-08-16 23:52:09 1028

原创 C++:std::memory_order_relaxed(宽松内存序)

memory_order_relaxed 是一种在不关心线程间操作顺序的情况下使用的内存序。它只保证操作的原子性,而不保证操作的顺序一致性,因此可以提高性能,适用于那些对顺序不敏感的场景,如计数器、标志变量以及单例模式中的双重检查锁定等。在这些场景中,正确使用 memory_order_relaxed 可以避免不必要的同步开销,提升并发程序的执行效率。

2024-08-16 23:41:52 932

原创 双重检查锁定(Double-Checked Locking)

双重检查锁定是一种在多线程环境中用于懒初始化的优化方法,能够减少不必要的锁开销。虽然传统的双重检查锁定模式在某些情况下存在内存模型问题,但通过 C++11 提供的新特性如 std::atomic 和 std::call_once,我们可以更安全地实现这一模式,并确保线程安全性。

2024-08-16 23:28:48 1954

原创 C++的RALL机制

RAII 是 C++ 中处理资源管理的强大方法,特别适合需要频繁分配和释放资源的场景。通过将资源与对象生命周期绑定,RAII 使代码更具可读性、异常安全性,并有效防止资源泄漏。这一模式在现代 C++ 编程中广泛应用,尤其是在管理内存、文件、线程同步等场景中。

2024-08-16 23:16:42 500

原创 C++的依赖注入

依赖注入(Dependency Injection, DI)是一种设计模式,用于减少代码中的耦合性,使得组件之间更加独立。它的核心思想是将对象的依赖关系从内部管理改为由外部传入,从而使代码更加灵活和可测试。在C++中,由于其编译时类型检查的特性,实现依赖注入通常比其他动态语言复杂一些。通过接口的方法来注入依赖,C++中这种方式较少使用,因为C++中接口的使用并不像Java或C#中那么普遍。总的来说,依赖注入是一种非常有效的设计模式,特别是在大型项目中,它可以帮助开发者更好地管理代码的复杂性。

2024-08-15 22:54:26 694

原创 编译报错:error: bitwise comparison always evaluates to false [-Werror=tautological-compare]

这个编译器报错信息 error: bitwise comparison always evaluates to false [-Werror=tautological-compare] 表示在你的代码中存在一个按位运算的比较,它在所有情况下都会评估为 false。这是因为这种比较的结果在逻辑上是不可能为 true 的,通常是由于编程错误或逻辑问题导致的。(1)检查比较逻辑:重新检查代码中的逻辑,确保位操作的使用是合理的,并且比较的条件是可能为 true 的。(2)调整掩码或比较条件:如果是掩码问题,调整掩

2024-08-14 23:32:44 664

原创 Hyper-V创建虚拟机安装OpenEulerOS

到此算是初步结束了。

2024-08-04 23:37:45 1520 1

原创 Visual Studio Code 配置Go开发环境

如果出现安装更新失败的情况,极有可能是GOPROXY代理的问题,默认代理是 https://goproxy.org ,通过 go env -w GOPROXY=https://goproxy.cn 命令把它修改为国内的代理,再重复一遍上诉操作即可成功。这三个目录构成了GO项目的工作目录,bin 目录存放的是项目源文件,pkg 目录存放的是编译后的源文件,src 目录存放的是开发的源代码文件,其下的目录称之为包。主要配置GOPATH变量,因为系统默认为C:/user/目录下,需要开发者根据自己实际配置。

2024-08-03 23:37:39 2166 4

原创 笔记本电脑屏幕发黄解决方案

1、在桌面空白处右键点击显示设置2、选中高级显示设置3、选择显示适配器属性4、点击颜色管理5、选择高级点击校准显示器按照提示步骤进行就OK啦

2024-06-02 21:25:37 2163

原创 docker部署

细心的朋友们已经发现我们在执行docker run的时候后面都会跟着一个/bin/bash,这是表示容器启动后运行的第一个进程,如果容器启动后没有进程运行那么马上就会退出,因此通常会启动bash作为容器启动项。但是这会带来一个问题就是如果你的服务是靠systemd进程拉起的,那么在容器里运行服务则会报错,因为容器里没有systemd进程。但是有时候我们的服务可能基础镜像满足不了,这时候我们可以直接把宿主机的环境打包成一个镜像来供docker容器使用。进入之后选择右侧的镜像资源里面的镜像中心。

2024-03-15 17:30:29 3607 1

原创 QEMU搭建虚拟机

安装完成之后,在你的系统上 /usr/bin/ 或者 /usr/local/bin/ 路径下会出现一大堆 qemu 开头的工具包,这些就是我们搭建虚拟机需要用到的工具,比如x86系统主要使用 qemu-system-x86_64 和 qemu-img 这两个工具来搭建虚拟机。关于QEMU的版本根据个人需要选择,版本越高,依赖的工具版本越高。在这里作者也有一点心得要分享,就是实践过程中要大胆尝试,我就是太谨慎了,总是想找到一篇最符合情境的指导来进行操作,最后发现其实都大差不差,导致浪费太多时间。

2024-03-14 10:44:53 12978 2

原创 RUST零基础入门——所有权

RUST中变量的有效范围其实和其他语言相差不大,都是从变量声明开始时生效,到离开变量作用域时失效。RUST变量不论存储在堆上还是栈上,超出作用范围时都会被删除,原因是RUST在变量超出范围时会自动调用一种特殊函数 drop 来回收内存,有点像C++类中的析构函数。这在RUST中是被允许的,因为它们都是基本数据类型,被存储在栈中。理论上是可行的,但是RUST认为这样会影响运行性能,因为如果是一大块数据,这样复制显然很耗费时间。上面这段代码就实现了深拷贝那张图的效果,两个变量都会生效,而且指向不同的两块内存。

2024-02-21 11:01:46 543

原创 RUST零基础入门——控制流

RUST中提供了 loop 、while 、for 三种循环方式。另外,在RUST中也可以借助 if else 语句实现类型三元表达式(A?RUST的条件语句与其他语言大体相同,都是 if else 关键字,这里重点介绍与其他语言的不同。

2024-02-19 20:32:34 449 1

原创 Shell基础

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。常见Shell脚本解析器/bin/sh、/bin/bash。Shell可以开子Shell进程,一层套着一层。子Shell环境变量对父Shell不可见。常用系统变量$ HOME、$ PWD、$ SHELL、$ USER。查看所有系统预定义全局变量env、printenv。set查看所有全局变量和局部变量。自定义变量方式 变量名 + “=” + 初值。

2024-02-18 17:36:23 1614

原创 Git基本操作

配置的过程,主要记录一下都用。

2024-01-06 18:00:21 389 1

原创 RUST零基础入门——函数

我们可以看到five函数的内容就是一个不带分号的5,这是一个表达式,返回值为5,同时也是five函数的返回值。我们也看到函数声明后面多个一个箭头一样的东西,这是因为RUST规定如果函数带有返回值,那么必须指定其返回值的类型,语法就是箭头后面加数据类型,比如上面这个例子就是返回值类型为i32。RUST函数的参数要求必须声明数据类型,其实这反倒和低级编程语言一样了,和C/C++语言非常相似,难怪需要C/C++基础,哈哈哈哈。下面是一个带有参数的函数的例子。而表达式是语句的一部分,且带有返回值,比如。

2024-01-05 16:49:15 375 1

原创 Vim常用命令

普通模式下按v/V即可进入可视行(Visual Line)模式;普通模式或者输入模式中按下:(英文冒号)或者/(斜杠)即可进入命令模式也叫底线命令模式(因为输入命令都在文件底部),在命令模式中可以输入并执行一些vim或插件提供的指令。vim filename 即可启动vim, Vim启动后默认位于普通模式,此时不能向文本中输入内容,相当于只读文件,可以通过一些特殊的按键组合执行对应的操作,下面是常用的命令。在普通模式中输入以下按键即可进入插入模式,该模式下可以通过键盘输入内容,按ESC键即退出回普通模式。

2024-01-04 11:36:22 435 1

原创 sockaddr、sockaddr_un、sockaddr_in、sockaddr_in6、struct in_addr、struct in6_addr的区别与使用

sockaddr_in结构体是和sockaddr结构并列且等价的结构体,因此它们二者之间可以互相转化,也是真正用来提供给程序员进行填充操作的结构体,区别在于sockaddr_in将sa_data划分为sin_port和sin_addr,也就是把端口和IP地址信息区分开,sin_port采用了网络字节序,同时为了保持和sockaddr相同的字节大小,填充了8字节的sin_zero。这也是一个只针对IPv4地址的结构体,因此它的sin_family只能是AF_INET。

2024-01-03 16:49:58 2188 1

原创 Windows常用快捷键

CTRL + HM // 键盘的ctrl键 + home/HM键。CTRL + END //键盘的ctrl键 + end/END键。

2024-01-03 10:44:53 420 1

原创 Linux常用命令

【代码】Linux常用命令。

2024-01-03 10:19:31 429 1

原创 RUST零基础入门——变量和数据类型

当我们尝试更改指定为不可变的值时,我们会遇到编译时错误,这一点很重要,因为这种情况可能会导致错误。如果我们的代码的一部分在假设值永远不会改变的情况下运行,而代码的另一部分更改了该值,则代码的第一部分可能不会执行其设计目的。事后很难追查这种错误的原因,尤其是当第二段代码有时只更改值时。Rust 编译器保证当你声明一个值不会改变时,它确实不会改变,所以你不必自己跟踪它。当然也不是完全不可变,RUST提供了两种可变的方式,一是通过。值得注意的是,RUST的变量是默认不可变的,什么意思呢?,声明常量的关键字是。

2024-01-02 20:07:59 545

原创 RUST零基础入门——Hello, World!

点进main.rs文件里发现rust给了一个示范程序就是打印hello, world!我们已经成功配置了vscode的rust开发环境,接下来正式开始学习编写RUST程序。至此,你成功的执行了第一个RUST程序!

2024-01-02 11:22:41 703

原创 RUST零基础入门——环境配置

先去安装VisualStudio,我安装的是VisualStudio2017professional版本。至此安装工作全部结束,接下来就可以愉快的写代码啦!本文基于windows操作系统,进入。如果显示版本则说明已经安装成功。

2023-12-29 17:14:22 1184 1

空空如也

空空如也

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

TA关注的人

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