自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-06-21 19:28:44 421

原创 Linux--进程间通信(system V共享内存)

这意味着,我们给两个进程使用同样的pathname和同样的id,调用同样的ftok,就能形成同样的key了。当多个进程都映射了同一块共享内存到各自的地址空间后 ,进程A可以将数据写入共享内存,然后进程B可以从共享内存中读取这些数据,从而实现进程间的数据交换。因为即使其他进程知道了你的共享内存段的键,它们也无法直接访问或修改你的共享内存段,除非它们也通过。key:属于用户形成,内核使用的一个字段,用户不能使用key来进行shm的管理,是给内核用来区分shm唯一性的(用户给操作系统用的)来指示具体的错误原因。

2024-06-07 16:02:15 879 7

原创 C++ map&&ste的封装

关于map和set的封装,底层都是红黑树。C++ 红黑树-CSDN博客RED,BLACK, _kv(kv){}public:else// 新增节点给红色else// parent的颜色是黑色也结束// 关键看叔叔// 叔叔存在且为红,-》变色即可// 继续往上处理else // 叔叔不存在,或者存在且为黑// g// p u// celse// g// p u// cbreak。

2024-06-01 15:59:21 598 1

原创 Linux--进程间通信(2)(有名管道)

这使得任何进程都可以通过该名称来访问管道,而不必是创建管道的进程的子进程。有名管道支持不同进程间的通信,甚至支持跨计算机(网络)的通信。有名管道的生命周期由创建它的进程控制,但即使创建它的进程终止,只要还有进程连接着管道,管道就会继续存在。命名管道在操作系统中表现为一种特殊类型的文件,它存在于系统的命名空间中,可以像打开文件那样被打开和读写。一旦创建,命名管道就可以在不同的进程中被打开多次,允许单向或双向的数据流传输。提供一个namepipe的类,它封装了命名管道的创建、打开、读写和删除的逻辑。

2024-05-28 13:43:46 730 2

原创 Linux--构建进程池

如果我们是关一个等待一个,那么第一个信道,只会关闭一个读端,但还有其它的读端,这就会发生进程阻塞,导致管道文件一直在等待读取,无法被释放;如果统一的关闭读端,那么当关闭到最后一个信道的时候,最后一个信道读端只有一个,管道文件会被释放,然后就会递归式的逆向关闭其它信道的所有读端,最后将所有的管道文件释放,父进程只需要一 一等待,就能回收所有子进程了。下面函数的主要逻辑是创建多个管道和相应的子进程,每个子进程都将从它自己的管道中读取数据,而父进程则保留管道的写端以便后续向子进程发送数据。,然后关闭读端并退出。

2024-05-28 13:43:13 1054 2

原创 Linux--进程间通信(1)(匿名管道)

我们通过文件的原理理解了管道,但是不能用文件的接口了,因为文件的接口没法让内存级缓冲区的数据不往磁盘刷新的,所以工程师做了一个专门的接口:pipepipe()系统调用pipe()系统调用用于在调用进程中创建一个管道(pipe创建的管道就是一个文件,但它不是普通文件,而是单独构成一种文件系统,他没有名字,故又称为匿名管道,并且只存在于内存中。它接受一个文件描述符数组作为参数,并在这个数组中填充两个文件描述符:一个用于读(pipefd[0]),另一个用于写(pipefd[1]这个管道只是让。

2024-05-28 13:42:14 1014 5

原创 C++ 红黑树

RED,BLACK, _kv(kv){}private:成员变量:_left_right和_parent分别指向节点的左子节点、右子节点和父节点。_kv是一个pair<K, V>,存储节点的键和值。_col表示节点的颜色,可以是RED或BLACK。构造函数:接收一个pair<K, V>作为参数,初始化节点的键值对,并将节点的颜色初始化为RED。其他指针成员初始化为nullptr。

2024-05-26 12:03:19 1052 1

原创 C++ 实现AVL树

int _bf;// 平衡因子, _kv(kv), _bf(0){}模板参数K和V是两个类型参数,分别表示节点中键(Key)和值(Value)的类型。成员变量_left:指向左子节点的指针。_right:指向右子节点的指针。_parent:指向父节点的指针。注意,有些AVL树实现可能不包括此成员,但在某些情况下,如需要快速向上遍历树时,它是有用的。_kv:一个pair,包含键和值。_bf(平衡因子):用于表示该节点左子树和右子树的高度差。平衡因子的值可以是-1、0或1。

2024-05-21 09:11:49 745 8

原创 Linux--动静态库制作使用及使用

我们在执行这段代码的时候,调用了里面的函数,我们没有该函数的实现,但可以使用它,是因为我们链接了它们的库,有gcc编译器完成链接,ldd可以查看当前可执行程序链接了上面库。综上所述,动态库和静态库各有优缺点,适用于不同的场景和需求。静态库在编译期间,就把库中的方法拷贝到了程序当中,未来加载就只谈论程序加载,与库没有关系,所以我们再谈库的加载时,不考虑 静态库,只考虑动态库。既然系统找不到我们的库文件,那么我们直接将库文件拷贝到系统共享的库路径下,这样一来系统就能够找到对应的库文件了。选项表示创建一个库。

2024-05-19 14:14:00 661 8

原创 Linux--软硬链接

例如,如果目录A硬链接到目录B,而目录B又硬链接回目录A,那么在遍历目录结构时,系统可能会陷入无限循环,导致无法正确定位或访问目录。当我们说一个目录的引用计数为2时,这通常是因为每个目录在其父目录中都有一个条目(即一个硬链接),并且它自己还有一个指向自己的。删除一个文件名和inode的关系,引用计数就变为1,再将硬链接删除,引用计数变为0,此时文件才会被删除。那如果我们的可执行程序被放到了一个很深的路径下,我们就只能这样运行我们的可执行程序,这就十分的麻烦了。和建立软连接的区别就是,少了一个-s选项。

2024-05-18 13:53:05 1071 3

原创 Linux--文件系统

在我们的计算机中是存在非常多的文件的,但只有少量的文件是被打开的,那没被打开的文件被存放在哪里呢?答案是:磁盘中,解下我们要先了解磁盘的知识,然后再引入文件系统(如何管理磁盘文件的),最后我们才能解释清楚一个重要的概念inode(索引节点),为下一章软硬链接做铺垫。

2024-05-17 13:31:36 685 9

原创 Linux-- 重定向&&缓冲区

查自己的文件描述表,分配最小的没有被使用的fd),那么现在向fd1中写就是在向log.txt中写,所以我们查看到log.txt中的内容就是printf&&fprintf输出的内容,这就是对文件做重定向。,因此fflush(stdout)此时的工作是将stdout缓冲区中的内容通过文件描述符1,刷新到log.txt内核文件缓存区当中去,这时候log.txt中才能看到内容。也就是我们没有关闭fd1,那么新打开的log.txt的fd就是3,我们使用了dup2的效果就是,如果指定的文件是一个符号链接,

2024-05-13 16:49:01 816 9

原创 C++ map&&set详解

翻译:1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2024-05-12 18:22:13 664

原创 C++ 搜索二叉树

2. KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。实际每个节点,就是多了一个与key关联的值,搜索二叉树的实现逻辑只是与key有关。(即当前节点存在),就继续执行循环体。: 如果当前节点的键与给定的键相等,: 如果当前节点的键小于给定的键,: 如果当前节点的键大于给定的键,: 开始一个循环,只要。

2024-05-11 14:08:33 961 9

原创 Linux--基础IO(文件描述符fd)

在打开文件的时候就要加上。

2024-05-07 19:10:23 788 8

原创 Linux--自主编写shell

while(*p!= '/') p--;}while(0)这里补充一下,如果命令输入错入,要删除重新输入。删除:CTRL+删除键退出自己写的shell:CTRL+c1.首先我们需要自己输出一个命令行lightmyshell]$ 获取用户名 主机名 所处的工作目录1.1获取用户名使用getenv函数从环境变量USER中获取值,并将其存储在名为name的类型的变量中。getenv函数返回指向该环境变量值的指针,如果该环境变量不存在,则返回NULL。1.2获取主机名。

2024-04-27 15:36:11 1414 3

原创 Linux--进程控制(2)--进程的程序替换(夺舍)

我们平时自己运行的程序,命令行参数和环境变量,是父进程通过将自己的环境变量表和命令行参数表通过,execvpe函数传递来的。它们通过替换当前进程的内存映像来执行新的程序,使得我们可以在一个进程中执行不同的程序,从而实现程序的切换和执行流程的改变。但他不是一个全新的程序,因为这个过程并没有创建新的进程,只是替换掉了原进程的数据和代码,依旧使用原来进task_struct,mm_struct,页表)一个新的程序来完全替代当前进程的内存映像,也就是替换掉原有的代码段、数据段和堆栈等内存管理的数据。

2024-04-27 09:58:20 887 6

原创 Linux--进程控制(1)

我们使用自定义的方式,来控制我们的返回信息(0:成功 1:除到0了 2 mod 0 了)

2024-04-26 10:18:42 829 3

原创 Linux--地址空间

父进程创建了变量g_val,100会存在于物理内存里(真实地址),但在这之前地址空间会给g_val一个虚拟地址,虚拟地址和真实地址都会被放在页表中,父进程通过页表使用虚拟地址就可以读取到g_val的值了。进程空间实际上就是操作系统给给每个进程画的饼,操作系统给每个进程的地址空间的大小都是真实物理内存的大小,比如真实的物理内存大小有100G,OS就会告诉每个进程,我会给你100G的大小供你使用, 这里给进程的100G就是地址空间,但这是虚拟内存,实际并没有那么大。其次,地址空间有助于实现进程间的独立性。

2024-04-21 19:08:31 619

原创 Linux--环境变量

当我们运行这个可执行程序的时候,就变成了进程,该进程的父进程就是Bash,Bash会构建命令行参数表,和命令行参数的个数传给main函数;如果我们也想让我们自己的程序执行的时候不需要加命令,我们可以将自己程序拷贝到上面的路径中去。我们发现,其实我们平时用的指令后面一般都会跟选项,为什么我们的指令可以有不同的选项,我们的选项跟不同的功能,这是因为指令和选项会传给它main函数中,对应的argc,argv来完成不同的功能,定义变量的本质,其实是开辟空间,在运行的期间我们的程序也能开辟空间。

2024-04-21 13:36:02 1042 6

原创 C++ 模板进阶

【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-04-18 16:47:36 532 7

原创 C++ queue&& priority_queue&&stack 详解及模拟实现

3.1queue的介绍1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。

2024-04-17 20:23:36 975 6

原创 Linux--进程(2)

这篇继续来学习进程的其它知识Linux--进程(1)-CSDN博客。

2024-04-04 20:46:44 1101 2

原创 Linux--进程(1)

在学习进程之前,我们要明白先了解两个东西:1.体系结构----硬件上2.操作系统----软件上。

2024-03-22 16:38:45 720 12

原创 C++ list详解及模拟实现

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-03-21 15:12:37 852 5

原创 C++ vector详解及模拟实现

1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。

2024-03-16 11:56:15 1098 8

原创 Linux--gdb(调试工具)

程序的发布方式有两种,debug模式和release模式Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。

2024-03-08 13:44:31 960 1

原创 C++ string类详解及模拟实现

当字符串长度小于16时,使用内部固定的字符数组来存放当字符串长度大于等于16时,从堆上开辟空间。

2024-03-05 17:09:03 928 10

原创 C++ 模板(初阶)

class 类模板名// 类内成员定义动态顺序表注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。

2024-02-22 13:31:00 827 3

原创 Linux小程序--进度条

在这里模len是为了防止数组的越界这时就有了旋转的效果了。

2024-02-20 16:52:25 1049 7

原创 Linux项目自动化构建工具-make/Makefile

这里带来三个新的符号,@指代目标文件,^指代依赖文件列表(^可以指代文件列表中的所有文件),$符号的作用,可以理解成占位符。这里的操作其实是类似于C语言的宏,如果一个项目里有很多地方要用到这个文件,那么这种写法将会更加的方便简洁,如果想更改目标文件和依赖文件,那么只用修改两个地方就行了。这是为了提高编译的效率,makefile只需要对比可执行文件的最近修改时间和源文件最近的修改时间,谁更新就可以了,,mytest是目标文件,mytest后面跟的是依赖文件列表,如果有多个文件按照空格为分隔符;

2024-02-17 16:48:08 945 2

原创 Linux--编译器-gcc/g++使用

1.首先,我们来看一段样例(见一下)2.见完之后,我们来看一下程序的翻译过程3.了解一下翻译的过程为什么是这样的?再顺带谈一下编译器。4.最后,我们要谈一下动静态链接,看一下它们的特点和区别。

2024-02-16 11:01:26 1110 7

原创 Linux--基础开发工具篇(2)(vim)(配置白名单sudo)

在前面我们学习了yum,也就是Linux系统的应用商店Linux--基础开发工具篇(1)(yum)-CSDN博客今天我们开始学习Linux的第二个开发工具vim。

2024-02-11 18:20:54 1507 4

原创 C++ 内存管理(new&&delete)

new用法的演示(与malloc对比):1.用法上,变简洁了// new 10个int对象malloc创建空间是调用函数的方式,而new则是关键字的方式,方便了很多。2.可以控制初始化// new 1个int对象,初始化成10//在堆上开一个数组,并完成初始化3.自定义类型,开空间+构造函数下面以创建单链表为例:这是单链表的方法:一个节点一个节点的开再看new的方法:直接开空间+构造函数这样就创造出来了三个结点。int _val;{}int _val;{}

2024-02-08 10:49:22 1247 7

原创 C++ 类与对象(下)

定义时不添加static关键字,类中只是声明3. 类静态成员即可用。

2024-02-05 17:49:30 1093 11

原创 C++ 类与对象(const成员)

显然是不可以的,(&d1 类型为const Date* 而 this 是 Date*,此操作放大了d1的权限,所以编译器是不支持的)。我们重载了<和>=两个操作符,,>=操作符设置权限为const,我们可以看到编译器同样是不支持,这种操作也是对权限的放大。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,运行成功,因为非从const对象的权限是要大于const成员函数的,所以是可以调用的)。对比3,这种操作显然是支持的,这是权限的缩小。,表明在该成员函数中。

2024-02-04 12:12:31 436 1

原创 C++ 日期类的实现

日期类的实现将综合前面所学的(类的6个默认成员函数),进一步理解和掌握类的6个默认成员函数。

2024-02-03 14:46:46 1063 8

原创 C++ 类与对象(中)续

赋值运算符重载

2024-02-02 14:51:23 849

原创 C++ 类与对象(中)

内置类型就是语言提供的数据类型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序。

2024-01-31 16:15:27 949 3

原创 C++ 类与对象(上)

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。一般情况下,更期望采用第二种方式。

2024-01-29 15:34:33 1070 8

空空如也

空空如也

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

TA关注的人

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