自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ IO流

使用itoa函数进行转化。int a = 10;//将整型的a转化为十进制字符数字存储在字符串arr当中使用sprintf函数进行转化。int a = 10;//将整型的a转化为字符串格式存储在字符串arr当中虽然itoa函数和sprintf函数都能完成转化,但是在两个函数在转化时,都需要先给出保存结果的空间,而空间的大小是不太好界定的,除此之外,转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,我们可以使用stringstream类对象来避开此问题。

2025-05-18 10:41:57 861 1

原创 Linux任务管理与守护进程

每当有一个用户登录Linux时,系统就会创建一个会话(session)任何进程都可以被设置为前台进程,只要前台进程被干掉系统会自动的将bash放到前台变成前台进程我下面写了一个死循环,创建一个文件 test.cc 测试它被干掉之后bash进程是否会自动顶替它可以看到在a.out运行期间不管我们输入多少次指令都是没有响应的,原因就是此时的前台进程已经不是bash了,当我们使用ctrl + c。

2025-05-16 19:10:59 759

原创 STL,智能指针和线程安全&&自选锁&&读者写者问题

不是.原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全.

2025-05-14 14:25:40 577

原创 网络套接字(二)

与UDP相比,TCP是流式的,多了一个监听。

2025-05-14 13:41:45 998

原创 unordered_map和unordered的介绍和使用

方式一: 指定key和value的类型构造一个空容器。//构造一个key为int类型,value为double类型的空容器方式二: 拷贝构造某同类型容器的复制品。//拷贝构造同类型容器um1的复制品方式三: 使用迭代器拷贝构造某一段内容。//使用迭代器区间构造方式一: 构造一个某类型的空容器。//构造int类型的空容器方式二: 拷贝构造某同类型容器的复制品。//拷贝构造同类型容器us1的复制品方式三: 使用迭代器拷贝构造某一段内容。//构造string对象某段区间的复制品。

2025-05-14 12:15:50 891

原创 网络编程套接字(一)

如果一台主机上的数据要传输到另一台主机,那么就应该作为该数据传输时的。但仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道。因此一个传输的数据当中应该涵盖其和,目的IP地址表明该数据传输的目的地,源IP地址作为对端主机响应时的目的IP地址。在数据进行传输之前,会先完成数据的封装,其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址。

2025-05-05 11:55:42 932 9

原创 线程池&&单例模式

单例模式是一种 "经典的, 常用的, 常考的" 设计模式.IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。

2025-04-26 22:24:05 1229

原创 哈希的应用 ——> 布隆过滤器

我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉 那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?用服务器记录了用 户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那 些已经存在的记录。如何快速查找呢?

2025-04-25 11:39:06 820

原创 【STL】bitset(位图) 的介绍,使用,模拟实现

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?将这一堆数进行排序,然后通过二分查找的方法判断该数是否在这一堆数中。将这一堆数插入到unordered_set容器中,然后调用find函数判断该数是否在这一堆数中。单从方法上来看,这两种方法都是可以,而且效率也不错,第一种方法的时间复杂度是O (NlogN) ,第二种方法的时间复杂度是O(N)。但问题是这里有40亿个数,若是我们要将这些数全部加载到内存当中,那么将会占用16G的空间,空间消耗是很大的。

2025-04-24 23:21:36 672

原创 C++11 线程库

由于thread提供了移动赋值函数,因此当后续需要让该线程对象与线程函数关联时,可以以带参的方式创建一个匿名对象,然后调用移动赋值将该匿名对象关联线程的状态转移给该线程对象。线程函数的参数是以值拷贝的方式拷贝到线程栈空间中的,就算线程函数的参数为引用类型,在线程函数中修改后也不会影响到外部实参,因为其实际引用的是线程栈中的拷贝,而不是外部实参。当线程函数的参数类型为引用类型时,如果要想线程函数形参引用的是外部传入的实参,而不是线程栈空间中的拷贝,那么在传入实参时需要借助ref函数保持对实参的引用。

2025-04-23 21:45:53 963

原创 Linux 生产者消费者模型

生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。

2025-04-20 14:57:56 1022

原创 Linux 线程互斥

对一个全局变量进行多线程并发 -- / ++ 操作是否是安全的?运行结果显然不符合我们的预期,因为其中出现了剩余票数为负数的情况。为什么无法获得预期结果?--ticket为什么--ticket操作不是一个原子操作?-- 操作并不是原子操作,而是对应三条汇编指令:loadupdatestore我们取出--tickets的汇编代码既然--

2025-04-18 23:52:17 1057

原创 Linux 多线程

1. 如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。2. 如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。3. 如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。4. 如果对thread线程的终止状态不感兴趣,可以传NULL给retval参数。用grep。

2025-04-10 21:52:51 1089 1

原创 Linux 下 日志系统搭建全攻略

DEBUG调试级别INFO信息级别WARN警告级别ERROR错误级别FATAL严重错误级别。

2025-04-05 19:01:06 706 1

原创 Linux 进程信号

其中1~31号信号是普通信号,34~64号信号是实时信号,普通信号和实时信号各自都有31个,每个信号都有一个编号和一个宏定义名称,这些宏定义可以在/usr/include/x86_64-linux-gnu/bits/signum-generic.h 中找到,例如其中有定义: #define SIGINT 2信号是如何记录的?实际上,当一个进程接收到某种信号后,该信号是被记录在该进程的进程控制块当中的。

2025-04-04 17:06:28 1378 10

原创 system V 消息队列&&信息量(了解)

msgget函数创建消息队列创建消息队列也需要使用ftok函数生成一个key值,这个key值作为msgget函数的第一个参数。msgget函数的第二个参数,与创建共享内存时使用的shmget函数的第三个参数相同。消息队列创建成功时,msgget函数返回的一个有效的消息队列标识符(用户层标识符),否则,返回-1,错误原因存于error中。shmget有设置大小的参数,而msgget没有消息队列的释放msgctl函数释放消息队列。

2025-03-26 16:50:42 987

原创 system V 共享内存

称为IPC键值,并返回这个key。在使用shmget函数获取共享内存时,

2025-03-26 08:28:48 812

原创 Linux 进程间通信

进程间通信简称IPC(Interprocess communication),进程间通信就是在不同的进程之间的传播或交换信息管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”例如:统计我们当前使用云服务器上的登录用户个数其中who命令和wc命令都是两个程序,当它们运行起来后就变成了两个进程,who进程通过标准输出将数据打到 “管道” 当中,wc进程再通过标准输入从 ”管道“ 当中读取数据,至此便完成了数据的传输,进而完成数据的进一步加工处理。

2025-03-25 23:41:00 921

原创 Linux 动静态库

完成头文件展开,去掉注释,宏替换,条件编译等,最后形成xxx.i文件完成词法分析,语法分析,语义分析,符号汇总等,最终形成xxx.s文件将汇编指令转换成二进制指令,最终形成xxx.o文件将生成的各个xxx.o文件链接例如:用 a.c b.c c.c d.c 以及main.c形成可执行文件,我们需要先得到这些文件的目标文件(二进制文件)a.o b.o c.o d.o 以及main.o,然后将这些目标文件链接起来,最后形成一个可执行文件。

2025-03-11 13:07:59 932 2

原创 Linux 软硬链接

与软连接不同的是,当硬链接的源文件被删除,硬链接文件依旧能正常执行,只是文件的硬链接数减少了一个,因为此时该文件的文件名少了一个,所谓的建立硬链接,本质就是在特定目录的数据块中新增文件名和指向文件名的inode编号的映射关系。命令我们可以看到,硬链接文件的inode编号和源文件是相同的,并且硬链接文件大小与源文件大小也是相同的,特别注意的是,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数(引用计数)都变成了2。1. 软连接是一个独立的文件,有独立的inode,而硬链接没有独立的inode。

2025-03-07 21:43:56 793 1

原创 LInux 文件系统

线性存储介质理解文件系统,首先我们必须将磁盘想象成一个线性的存储介质,例如磁带,当磁带被卷起来时,其就像磁盘一样是圆形的,当我们将磁带拉直后,它就是线性的抽象理解磁盘从逻辑结构来看,磁盘是线性的,所以为了更好的理解磁盘,我们将磁盘理解成一个数组所以我们可以根据下标28888反推回它在线性结构的那个区域,然后进行访问一个磁盘有5个盘片,每个盘面有2w给扇区每个盘面50个磁道,每个磁道400个扇区1.确定在那一面28888 / 20000 = 1面(从第0面开始),它在第一面2.在哪一个扇区。

2025-03-06 22:41:52 1041

原创 C++的类型转换

由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中保存,当需要读取const变量是就会直接从寄存器中进行读取,而我们修改的实际上是内存中变量 a的值,因此打印出来的是修改之前变量a的值。上述代码中,如果传入fun函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么pb1会有对应的地址,而pb2则会返回一个空指针。向上转换是语法天然支持的,不需要进行转换,而向下转换是语法不支持的,需要进行强制类型转换。

2025-03-02 22:53:13 992 1

原创 Linux基础IO

当fopen以写入的方式打开一个文件时,若文件不存在,则会自动在当前路径创建该文件,那么这里所说的当前路径指的是什么呢?例如,我们在test_2_26目录下运行可执行程序myproc,那么该可执行程序创建的log.txt文件会出现在test_2_26目录下这里是否能说明的“当前路径”是指当前可执行程序所处的路径这时我们删除刚才可执行程序生成的log.txt先删除测试一下:回退到上级目录,在上级目录下运行该可执行程序。

2025-03-01 21:21:53 713 1

原创 Linux 进程程序替换

子进程刚被创建时与父进程共享代码和数据,但当子进程需要进行进程程序替换的时,也就意味着子进程需要对其数据和代码进行写入操作,这时就需要将父子进程共享的代码和数据进行写时拷贝,此后父子进程的代码和数据也就分离了,因此子进程进行程序替换后不会影响父进程的代码和数据。事实上,只有execve才是真正的系统调用,其他五个函数最终都是调用的execve,所以execve在man手册第2节,而其他五个函数在man手册的第3节,也就是说其他五个函数实际上是对系统调用execve进行了封装,以满足不同用户的不同调用场景。

2025-02-21 15:33:02 1207 3

原创 Linux 进程控制(进程创建,进程等待)

我们都知道main函数是代码的入口,但实际上main函数只是用户级别代码的入口,main函数也是被其他函数调用的,例如在VS2022当中main函数就是被一个名为__tmainCRTStartup的函数所调用,而__tmainCRTStartup函数又是通过加载器被操作系统所调用的,也就是说main函数是间接性被操作系统所调用的。在上述的例子中,当子进程未退出时,父进程都在一直等待子进程的退出,在等待期间,在等待期间父进程没有做任何事情,这种父进程处于阻塞状态下的等待叫做阻塞等待。

2025-02-17 17:51:37 850 3

原创 Linux 进程地址空间

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增 加,我们称之为进程调度O(1)算法!

2025-02-14 14:37:30 1195 5

原创 Linux 环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

2025-02-11 12:48:49 1170 3

原创 Linux进程概念

当一个进程要退出的时候,在系统层面,该进程的资源并不是立刻被释放,而是要暂时存储一段时间,以供操作系统或是其父进程进行读取,如果该进程的退出信息一直未被读取,则相关数据是不会被释放掉的,一共进程若是正在等待其退出信息被读取,那我们就称这种状态为:僵尸状态(zombie)例如,我们写代码时都在主函数最后返回0。观察代码运行结果,在父进程未退出时,子进程的PPID就是父进程的PID,而当父进程退出后,子进程的PPID就变成了1,即子进程退出后,子进程的PPID就变成了1,即子进程被1号进程领养了。

2025-02-09 10:45:57 966 1

原创 初步认识操作系统(Operator System)

管理者管理被管理者,实际上就是对这个。

2025-02-02 10:25:42 731 5

原创 冯·诺依曼体系结构

所以以上体系结构虽然可以使用,但是还不够完善,于是为了解决输入输出设备和cpu配合使用慢的问题,我们可以通过在它们之间加入存储器也就是内存,提高整个体系的速度,内存的速度比输入输出设备快很多,但是比cpu慢,内存在整个体系结构当中起着缓冲的作用,总的来说还是提高了整个体系的速度。登录qq,qq这款软件加载到内存中,然后中央处理器开始执行qq的代码,我使用输入设备(键盘)将信息放到内存中,然后CPU进行打包计算,计算完成之后将数据放回到内存中,通过输出设备(网卡,显示器)

2025-02-01 16:05:18 806 6

原创 Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.

2025-01-28 09:50:51 2382 2

原创 C++实现红黑树

/红黑树结点颜色,_kv(kv),_col(Red)//初始值为红色{}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?如果将结点的默认颜色设置为黑色,那么就会和性质4相冲突,它是必然会发生的如果是红色就会有两种情况:1.它的父亲结点为黑色时,这时可以直接插入,不需要调整2.它的父亲结点为红色时,就会与性质3相冲突,这时将需要进行调整使用黑色作为结点的默认颜色一定会出问题,但是使用红色默认颜色不一定会出问题,这就是为什么使用红色作为默认颜色而不是黑色的原因。

2025-01-17 23:09:53 918 9

原创 Shell的运行原理以及Linux中的权限问题

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel? 从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:对比windows GUI,我们操作windows不是直接操作windows内核,而是通过图接口形,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘

2025-01-16 17:40:19 934 2

原创 C++ —— 智能指针

内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致响应越来越慢,最终卡死。

2025-01-03 16:53:19 1188 8

原创 C++异常处理

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家 随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了最基础的异常类至少包含错误编号和错误描述两个成员变量,甚至还可以包含当前函数栈帧的调用链等信息。该异常类中一般都会提供两个成员函数,分别来获取错误编号和错误描述。public:, _id(id){}int GetErrid() const //获取错误id。

2024-12-27 22:15:44 1100 21

原创 【C++11】包装器

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。Func();上面func可能是什么呢?那么func可能是函数名?函数指针?函数对象(仿函数对象)?也有可能 是lamber表达式对象?所以这些都是可调用的类型!如此丰富的类型,可能会导致模板的效率低下!为什么呢?我们继续往下看return x;return i;int main()//使用函数指针//使用仿函数//使用lambda表达式}, 30.0);return 0;

2024-12-26 09:49:08 1194 21

原创 【C++11】可变模板参数

template //Args全称:arguments返回类型 函数名(Args... args)//函数体下面就是一个基本可变参数的函数模板{}Args:是一个可变模板参数包args:是一个函数形参参数包模板参数Args前面有省略号,代表它是一个可变模板参数,我们将带省略号的参数称为“参数包”,这个参数包中可以包含0到任意个模板参数,args则是一个函数形参参数包。

2024-12-21 18:29:03 1442 40

原创 【C++11】lambda表达式

实际中我们使用[&]或[=]的方式捕获变量时,编译器也不一定会把父域中的所有变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,它不会将用不到的变量捕获进来,主要看编译器的具体实现。就算加上mutable之后,x,y的const属性被取消了,但是使用传值的方式进行的捕获,是无法进行对两个局部变量进行值交换的。实际在底层,lambda表达式的处理方式和函数对象一样。其实可以看到在上面的代码中几个相同的lambda是相同的,类型也是不一样的,类型不一致也就是它们不能相互赋值的根本原因。

2024-12-15 16:30:35 813 15

原创 【C++11】类的新功能

C++11可以让我们更好的控制要使用的默认成员函数,假设在某些情况下我们需要使用某个默认成员函数,但是因为某些原因导致无法生成这个默认成员函数这时可以使用default关键字强制某个默认成员函数public:{}private:int main()Person p;return 0;实例化一个对象,没有给参数进行构造,编译器会报错,因为我们并没有在Person类中实现默认构造函数,并且我们实现了构造函数,编译器也不会自动生成默认构造函数。

2024-12-14 12:01:22 678 34

原创 【C++11】 右值引用和移动语义

左值是一个表示数据的表达式,如变量名或解引用的指针。

2024-12-10 23:22:32 6189 41

空空如也

空空如也

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

TA关注的人

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