- 博客(34)
- 收藏
- 关注
原创 计算机网络:基于TCP协议的自定义协议实现网络计算器功能
Jsoncpp 是⼀个⽤于处理 JSON 数据的 C++ 库。它提供了将 JSON 数据序列化为字符串以及从字符串反序列化为 C++ 数据结构的功能。Jsoncpp 是开源的,⼴泛⽤于各种需要处理 JSON 数据的 C++ 项⽬中。1. 简单易用:Jsoncpp 提供了直观的 API,使得处理 JSON 数据变得简单。2. 高性能:Jsoncpp 的性能经过优化,能够⾼效地处理⼤量 JSON 数据。3. 全面支持:⽀持 JSON 标准中的所有数据类型,包括对象、数组、字符串、数字、布尔值和 null。
2025-11-06 10:51:29
1179
11
原创 计算机网络:UDP网络编程
/ 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器)参数:AF_INET:IPv4网络协议族(用于跨主机TCP/UDP通信)AF_INET6:IPv6网络协议族AF_UNIX:本地通信协议族用于本主机内进程通信SOCK_STREAM:流式套接字,基于TCP协议,提供可靠,面向连接,面向字节流的网络通信。SOCK_DGRAM:数据报套接字,基于UDP协议,提供不可靠,无连接,面向数据报的网络通信。
2025-11-02 17:19:27
616
4
原创 计算机网络:Socket编程预备
一个端口号只能被一个进程占用,一个进程可以有多个端口号,但一个端口号只能标识一个进程。这个问题的原因我们在后面的代码过程中我们再去解释。(这里有坑需要埋)
2025-11-01 10:33:57
731
7
原创 计算机网络:网络基础
上面我们说了协议是一种“约定”,这个过于抽象那能不能形象一点,我们的操作系统都是C/C++语言编写的,在我们的语言中我们如何实现“约定”呢?其实结构体不就是一个很好的约定的载体吗?我们两者约定好结构体的结构体变量,这不就相当于我们做好了约定。主机A,B约定好结构体的内容,A向B中传输a = 10 ,sep = '\r',主机B用约定的结构体去接收能不能接收到数据,答案肯定是可以。所以我们所说的协议是什么?协议就是通信双方都认识的结构化的数据类型。局域网(Local Area Network,简称。
2025-10-23 19:00:00
1085
2
原创 Linux 线程的同步
上一篇博客我们详细介绍了线程的互斥量,我们知道当我们引进一个新技术的时候也同样的会带来新的问题,这篇我们将介绍然后解决由线程互斥带来问题。
2025-10-21 08:50:29
829
2
原创 Linux 线程互斥
上一个博客我们详细介绍了原生线程库pthread,线程带给我们的优势是我们可以毫不费力的实现多线程看见同一份资源,不知道还记得我们在进程实现让进程看见同一份资源花费了多少的心思,但这个优点可能也是线程的一个缺点,为什么?因为我们无法保证共享资源的访问是原子的,这一篇博客我们将来解决这个问题。
2025-09-25 18:15:00
1086
1
原创 Linux 线程之pthread库
序言:上一篇博客我们详细介绍了线程的概念,这篇博客我们将介绍关于Linux原生线程库的相关操作进一步了解线程。
2025-09-21 18:44:36
950
1
原创 Linux 线程的概念
如果现在我们在一个主进程创建一个 “进程”(这里的进程只需要PCB不需要创建地址空间等内核数据),这个“新进程”可以看见和使用主进程的系统资源。如果可以把资源划分给不同的PCB再让不同的PCB执行对应的资源,这就是线程的概念。如何去划分资源?地址空间就是资源的代表,划分地址空间不就相当于划分资源吗?,划分地址空间换一句话来说不就相当于划分虚拟地址范围,如果我们可以让不同的执行流去执行不同的函数不就相当于去划分了资源。为什么执行不同的函数就相当于划分资源?
2025-09-17 19:26:26
1012
1
原创 Linux 进程信号之信号的捕捉
为了实现操作系统的安全性,因为内核态的权限高如果有恶意的程序去执行一些恶意代码的话,操作系统的安全性就无法保证。如果我们在加上一个时钟源作为外部信号,定时向CPU发送信号让它去执行对应的代码。因为时钟源的频率很高是nm级别的如果把它放在外边会和其他的外部设备发的信号产生冲突,所以工程师们把时钟源集成在了CPU上。其实时钟源的频率就是我们买电脑CPU时关注的主频。
2025-09-13 19:15:00
1406
1
原创 Linux 进程信号之信号的保存
这篇博客我们详细介绍了信号是如何在进程中保存的,在进程中我们用三张表来描述信号的是否被阻塞,是否被递达,进程采用什么方法去处理信号,在然后我们介绍了sigset_t和它相关的函数,我们可以用这些函数修改sigset_t类型从而有了修改进程三个表的可能,再然后我们介绍了sigprocmask这个函数是用来查看和修改进程的block表,sigpending这个函数可以查看进程的pending表,我们可以发信号去修改进程的pending表,最后我们证明了pending表的修改是在信号处理之前的。
2025-09-08 09:16:49
712
2
原创 Linux 进程信号之信号的产生
用来对于信号的自定义捕捉。sighandler_t:是对返回值为void*参数为int类型的函数指针的 typedef 出来的类型,将来我们想要捕捉的信号的编号将会被传进去。handler:是我们传进去的自定义方法。signum:我们想要对哪个信号进行自定义捕捉。std::cout <<"收到了" << sig << "号信号" << std::endl;int main()std::cout << "我是一个进程 pid:" << getpid() << std::endl;
2025-09-05 17:39:50
1131
2
原创 Linux 进程间通信之System V 共享内存
上个博客我们介绍了命名管道的原理和实现,这篇博客我们将介绍System V标准的共享内存的实现原理,系统调用 ,和其他几个进程间通信的区别和优缺点。
2025-08-23 19:05:39
986
1
原创 Linux 进程间通信之匿名管道
上面我们说过当我们创建一个匿名管道以读写的方式,所以我们要知道以读/写打开的文件描述符分别是什么。那么pipefd这个参数就是为了解决这个问题,pipefd[0]里面存放的是以读方式打开的文件描述符,pipefd[1] 里面存放的是以写方式打开的文件描述符。如果函数调用成功的话会返回0,如果不成功的话会返回1并且错误码被设置。
2025-08-15 14:57:48
645
2
原创 Linux 动静态库的制作和使用
无论对于动态库还是静态库来说,库的本质就是 .o 文件的集合。使用动态库可以节省内存空间在使用到库方法的时候跳转到库中等执行结束了以后再接着执行可执行程序中接下来的代码,多个程序可以共用一个动态库,所以动态库又叫共享库,而静态库可以将二进制数据拷贝到可执行程序文件中,在执行的时候不需要跳转,但每个可执行程序都需要拷贝对应的数据造成内存浪费。本篇关于Linux的文件理解与操作的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持纠正!!!
2025-08-02 21:36:15
765
2
原创 Linux Ext文件系统
本文主要讲述的是ext2文件系统,ext3和ext4在ext2的基础上增加了日志系统,提升了管理的容量和性能等,但这三个文件系统的核心设计没有变化,我们将先从硬件介绍,再到文件系统。
2025-07-30 09:51:54
892
1
原创 Linux 重定向和缓冲区
前面在这篇博客里说了很多函数无论是在语言层还是在系统调用的方面。在调用系统调用open的时候会返回一个整型,在write传参的时候第一个参数是一个叫fd的东西,这个是什么东西?这篇博客会详细解释这个问题。
2025-07-22 20:42:40
745
1
原创 Linux 基础文件IO操作
一个文件里边没有任何数据那么这个文件的大小是0KB吗?答案是:不是的他还有他的属性,换一句话来说 文件 = 内容 + 属性。所以我们对文件的操作可以大概分为两种一个是对文件内容的操作和文件的属性操作。我们从文件是什么?文件操作本质是什么?开始说起,分析了C语言和系统调用常用的一些文件操作,我们在最后在想一个问题:文件操作是C语言独有的吗?这个答案肯定不是的,C++,Java,等语言中都有,他们都是把这些系统级调用进行封装用来面对上层不同的需求,也为了更好的实现跨平台。
2025-07-20 20:56:55
945
3
原创 Linux 程序地址空间
在我们之前学习C语言/C++的时候可能我们看过下面图片,当时有人告诉我们不同的数据和代码存放在了内存的什么地方,当我们现在学习了操作系统了以后我们对这个图片产生了一些疑问,我们我们在之前的博客说过进程的产生如果我们的内存是这样排布的我们的进程应该怎么去存放?现在我们将提出虚拟地址空间也叫程序地址空间。那什么是虚拟地址空间?说的形象一点,假设操作系统是老板,进程是员工,那么虚拟地址空间就是老板给员工画的大饼,操作系统告诉进程,这个内存里边只有你和我在这里边,你只要好好进行这里边的内存全部是你的。
2025-07-15 11:44:39
1111
原创 Linux 环境变量
在操作系统书上的定义是;指在操作系统中用来指定操作系统运行环境的一些参数。比如我们想在Linux上执行我们自己写的可执行程序要指明路径如果不指明路径会 “command not found”,那我们知道命令都是一个个的可执行文件为什么命令不用在前面加路径呢?这就是因为有环境变量的存在,换一句话来说更形象的描述环境变量就是:环境变量就是一些特殊的全局变量来记录操作系统的一些参数。可能你不太理解这句话看完这篇博客我相信你会明白。
2025-07-11 10:37:31
1111
原创 Linux 文件权限
权限按照我们日常的理解权限就是是否有做一件事的权利。我们举一个例子更深刻的理解权限这个词。举个例子:你在一款视频软件中我们可以看见软件把用户分为两类VIP和非VIP,如果你不是VIP你就看不了VIP看的东西,这就是人也可以说是身份。那如果你要定外卖可以在一个视频软件上定吗?这个答案是不可以,这就是属性,一个事物没有这个属性就算你的身份是正确的也做不了这件事。那么Linux的文件权限也分为了身份和文件的属性,下面我们先从身份的角度入手。
2025-07-08 12:17:27
771
原创 从继承到多态:C++面向对象进阶核心
上面的代码答案是什么:A、运行报错 B、编译报错 C、B->1 D、B->0 E、A->1正确答案是B->1 ,为什么呢?指针a是B类型的同他调用test函数,test函数里的this指针是什么类型的呢?
2025-06-04 11:35:36
619
原创 C++ 继承
对于访问限定符来说,public可以在类内,类外都可以访问,protected可以在类内访问,类外不可以访问,但当被派生类继承可见,private可以在类内访问,类外不可以访问,并且可以被派生类继承但不可见。对于继承方式来说,确定基类成员被派生类继承以后在派生类中的访问方式 == Min(继承方式,基类中成员的访问方式),public > protected > private。
2025-06-01 20:40:16
702
原创 深入理解C++11:现代C++编程的核心特性与实践
我们在上面说过无论是左值引用还是右值引用都是属性都是左值,所以当一个变量是右值传给函数中的一个右值引用以后这个引用在去传给其他的函数就会调用左值版本这就会和我们的目的相反,我们传的是右值当然我们也想当在这个函数中调用其他还是时也是调用右值版本,这时就提出完美转发,用完美转发就可以将一个变量在保证其属性不变的情况下往下传。隐式捕捉可以分为用“ = ”隐式值捕捉,和 “ & ”隐式引用捕捉,隐式捕捉可以把全部可以捕捉的对象全部值捕捉,隐式引用捕捉可以把全部可以捕捉的对象全部引用捕捉。
2025-05-25 10:33:24
959
原创 红黑树:高效平衡二叉搜索树的实现
红黑树是以一种二叉搜索树,红黑树的节点会单独再储存一个颜色,这样红黑树可以通过不同节点中的颜色来控制整棵树,红黑树的增删查改的时间复杂度是logN,和AVL树是一个量级的但要稍微比AVL树低一点。
2025-05-19 18:10:48
1713
原创 数据结构之 AVL树(内附C++实现)
这里我们通过控制平衡因子来判断现在的树是不是AVL树和来控制AVL树 ,当然我们也可以不通过平衡因子的方法来实现AVL树, 平衡因子 = 右子树的高度 - 左子树的高度(也可以是其他的方式 ,比如 左子树的高度 - 右子树的高度 )。当平衡因子为2 / -2时我们去通过旋转的方式把这个树变成AVL树。ALV树是一颗二叉搜索平衡树,AVL树的出现可以很好的避免出现二叉搜索树出现单枝的情况出现保证了效率不会出现很大的下降,他的性质是左右子树都是AVL树,左右子树的高度差不高于+1/-1。
2025-05-05 18:27:55
827
原创 C++详解之list
list是序列容器,list的数据结构是一个双向带头链表,可以支持在任意节点O(1)的插入节点,list的成员变量是指向头节点的一个ListNode*类型的指针,这里大家可能有疑问为什么list的成员变量只要一个指向头节点的指针呢?这是以为list对于ListNode和ListIterator进行了一层封装,为什么要这样呢?我们要先从list与vector的区别开始说起。
2025-04-16 09:49:39
949
原创 【C++ STL】vector详解
vector的中文意思是向量的意思,说人话就是一个顺序表,他本身也是一个数组,但有人有疑问string不也是顺序表吗?为什么还需要vector,因为string只能存char类型的对于其他类型不能存储,还有一点是对于字符的顺序表有很多单独的接口需要实现但对于其他类型的顺序表并不太需要这就会导致把string并入vector不太合适所以他们两是分开的。下面是文档对于vector的介绍。
2025-04-02 11:50:28
1811
1
原创 C++中的String的常用函数用法总结和模拟实现
这里是string的构造函数和拷贝构造函数,它支持用string,字符串,单个字母,迭代器等去构造。要注意这里的用迭代器拷贝构造不仅仅可以用string的还可以用其他的容器。对于构造函数的实现可以写成这样 ,这里只简单的实现了一下他的默认构造函数和拷贝构造函数。
2025-03-19 10:21:23
1887
原创 C++——模板初识
我们在C++中可以对函数进行重载,但对于不同类型变量还是要写对应的函数这样还是很麻烦,比如Add函数我们如果要实现对int类型的相加我们要实现Add(int a,int b),如果我们还要对double类型的相加我们还需要写一份Add(double a,double b),这两个函数的逻辑相同只是在参数列表中的形参类型不一样有没有什么办法可以让我们实现复用这样就可以减少我们的工作量。这时模板就可以很好的帮我们解决这个问题。模板可以提高代码的复用率还可以帮助我们实现泛型编程。下面图展示了类的分类。
2025-03-01 11:44:09
514
原创 C++——默认成员函数
默认成员函数是我们没有写编译器也会自动生成的成员函数,一个类我们不写的会自动帮我们生成6种默认的成员函数,在C++11中又增加了两个默认的成员函数,移动构造和移动赋值这两种我们以后再谈。
2025-02-21 20:15:33
532
原创 C++基础——函数重载
同一作用域中出现同名函数,但是要求同名函数的形参不能一样(个数,类型等)。这样C++函数调用就表现出多态的特点,使用更加灵活。
2025-02-15 18:54:41
329
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅