- 博客(61)
- 收藏
- 关注
原创 进程信号(下)
上文:进程信号(上)-CSDN博客在上篇中,我们讲了关于信号的保存,信号集的操作,那么这篇我们就来看看信号的原理。目录1. 键盘产生信号的原理2. 信号是如何被处理的? 2.1 信号处理的原理 2.2 内核态与用户态2.2.1 内核空间 2.2.2 内核态与用户态的切换 3. 捕捉信号的其他方式 sigaction3.1 函数定义3.2 参数说明3.3 sigaction结构体3.4 sa_flag标志3.5 使用示例 4. 可重入函数 不可重入可重入5. volatile在上篇中,我们讲了信号产生的几种方
2024-06-16 14:09:00 1167
原创 进程信号(上)
本节目标:1. 掌握Linux信号的基本概念2. 掌握信号产生的一般方式3. 理解信号递达和阻塞的概念,原理。4. 掌握信号捕捉的一般方式。5. 重新了解可重入函数的概念。6. 了解竞态条件的情景和处理方式7. 了解SIGCHLD信号, 重新编写信号处理函数的一般处理机制。
2024-06-05 16:49:35 898
原创 简易进程池的实现
进程池(Process Pool)是一种用于管理和复用多个进程的技术或设计模式。在进程池中,一定数量的进程会被预先创建并保持在内存中,以便在需要时立即使用,而不是每次需要进程时都重新创建新的进程,这样可以提高系统的性能和效率。进程池通常用于需要频繁创建和销毁进程的场景,例如网络服务器等。通过预先创建一些进程并保持它们处于空闲状态,可以避免频繁创建和销毁进程所带来的开销,并且可以更好地控制同时进行的进程数量,以避免系统资源被耗尽。
2024-05-25 20:09:31 581
原创 进程间通信(下)
1. system V共享内存共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据那么这到底是为什么呢?1.1 共享内存示意图我们来看看吧!下图就是shm的原理图。所谓共享区,就是在内存中开辟的一块空间,然后将该内存空间挂接在进程的共享区中,这里的挂接就是将内存空间的实际地址由页表进行映射转为虚拟地址,将此虚拟地址存放入共享区(存放的还有该共享内存空间的其他相关信息,比
2024-05-25 10:15:26 1077
原创 进程间通信(上)
管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。上图就是who进程将信息写入管道,wc-l接收并输出给用户的过程!
2024-05-23 14:06:06 875
原创 Linux基础IO(下)--动静态库
我们经常听人说库,有粮库,水库,信息库等,那么在计算机领域的库又是什么呢?我们日常说的库是存储某类或多类资源的地方,而我们要学习的库也是如此。那么计算机领域中的库都有什么呢?:程序在。程序运行的时候将不再需要静态库。:程序在,多个程序共享使用库的代码。一个与,而不是外部函数所在目标文件的整个机器码。(即将库加载到进程中,保存库中所需代码的地址,运行时再去寻找函数)在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为。
2024-05-20 21:17:04 920
原创 c++红黑树的模拟实现
enum ColorRED,BLACKpublic:RBTreeNode(const pair& kv,const Color& color=RED)//颜色的缺省参数给定为红色:_kv(kv)private:其他的我们都能理解,但是颜色的缺省参数为什么给定红色呢?我们想一想,根据红黑树的几条性质,我们插入的时候要怎么检测呢?难道每插入一个都检查一下树的每条路径黑色节点个数是否相同吗?当然不是,插入时我们只需要检测是否有连续的红色节点。
2024-05-12 20:13:36 1295
原创 c++AVL树的模拟实现
AVL与红黑树中存放的数据都是pair结构。//左孩子//右孩子//父亲int _bf;//平衡因子,健康的平衡因子绝对值不大于1:_bf(0),_kv(kv){}这里可以看到,AVL树的节点与平衡二叉树的节点区别在于AVL树节点有一个平衡因子的存在,也即1.1概念中所述。同时AVL树采用了三叉链结构,好处在于在对树进行操作时,不必额外存储节点的父亲。假如以pParent为根的子树不平衡,即pParent的平衡因子为2或者-2,分以下情况考虑。
2024-05-11 17:07:26 1298 1
原创 c++关联容器之map与set(上)
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set(后面讲)容器慢,但它们允许根据顺序对子集进行直接迭代。5. set在。
2024-05-01 20:20:05 34
原创 Linux基础IO(中)
文件系统是一种用于管理计算机存储设备上的数据的方法。它定义了文件和文件夹的组织方式,以及如何访问、存储和管理这些文件。文件系统还负责处理文件的命名、权限控制、数据存储和恢复等功能。常见的文件系统包括FAT、NTFS、ext4等。不同的操作系统支持不同的文件系统,例如Windows通常使用NTFS,而Linux通常使用ext4。
2024-04-29 18:48:04 805
原创 c++二叉树的进阶--二叉搜索树
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树注意:二叉树的中序遍历是一个有序(升序)序列。
2024-04-24 16:38:47 502
原创 Linux--基础IO(上)
文件=内容+属性。常说的对文件进行操作,不仅是对文件内容的读写,也有对文件属性的修改。比如修改文件名称,更新文件最新写入时间等。
2024-04-21 13:20:16 799
原创 继承与多态常见的面试题
A: 继承 B: 模板 C: 对象的自身引用 D: 动态绑定派生类无需理会基类方法的实现,但可以调用继承下来的有访问权限的方法。
2024-04-20 17:31:30 783
原创 c++三大特性之多态
虚函数是多态的必备构成条件之一,所谓虚函数,就是被virtual关键字修饰的成员函数。如下图就是Person类中的一个虚函数func()。
2024-04-18 13:23:39 944
原创 c++三大特性之 继承
以下图为例记得构造函数初始化列表的顺序吗?是按照声明顺序初始化的,基类成员显然是在派生类之前定义的。我们很难保证在派生类析构函数中不会对基类有什么操作,如果子类对象中包括基类动态开辟的空间,如下图。倘若我们先析构父类,那么如果在子类的析构中用到这块new出的空间,就会访问野指针。下面的图非常形象的总结这里的知识。1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。
2024-04-12 21:49:01 733
原创 c++之模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-04-10 21:12:44 999
原创 c++之stack_queue与反向迭代器的实现
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数返回队头元素的引用返回队尾元素的引用push_back。
2024-04-09 20:00:32 1083
原创 Linux进程控制
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!
2024-04-01 17:38:37 1497
原创 c++----list模拟实现
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向带头循环链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝后迭代。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2024-03-30 12:29:02 991
原创 Linux进程概念(下)
我们可以使用上文中的脚本开启进程监视器,同时使用上文使用的代码来监视父子进程的状态。while :;sleep 1;doneint main()//fork创建子进程,子进程fork返回0,父进程返回pidsleep(2);if(id==0)//子进程int cnt=10;num=999;sleep(1);return 0;监视结果如下,我们看到刚开始两个进程都是睡眠状态??
2024-03-29 17:18:35 1055
原创 Linux进程概念(上)
内存是计算机用来存储数据和程序的临时存储器。它通常被称为RAM(随机存取存储器),用于临时存储正在运行的程序和数据,以便CPU能够快速访问和处理这些信息。
2024-03-26 20:12:24 683
原创 STL----vector的模拟实现
(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造vector的类模板可以实例化各种类型,无论是内置类型int,char或是自定义类型string,vector都可以。//无参//构造并初始化//拷贝构造//使用迭代器区间进行初始化定义iterator的使用接口说明begin +end(重点)
2024-03-25 16:47:03 1060
原创 六大排序精解
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
2024-03-21 14:23:50 946
原创 Linux编译器--gcc/g++的使用
gcc与g++分别是c语言与c++代码的编译器,但同时g++也兼容c语言。我们知道在Linux中,系统并不以文件后缀来区分文件类别。但对于gcc与g++等编译器而言却是需要的。Linux中c代码文件的后缀是.c,c++代码文件的后缀是.cpp(.cc)(.cxx)。在Linux中,我们可以借助如下命令查询gcc/g++的版本如果我们查询失败,显示系统中没有gcc/g++,那么我们可以借助yum工具来进行安装。这里要注意,gcc只能编译c语言代码,而g++同时兼容c/c++。
2024-03-19 20:34:51 592
原创 Linux基础开发工具之yum与vim
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.
2024-03-13 15:55:36 1205
原创 string类详解与模拟实现
C++中的迭代器是一种用于遍历容器(如数组、向量、链表等)中元素的对象。迭代器提供了一种统一的访问容器元素的方式,使得我们可以通过迭代器来访问容器中的元素,而不用关心容器的具体实现细节。在C++标准库中,迭代器被设计为类似指针的对象,可以通过递增(++)和递减(--)操作符来访问容器中的元素。迭代器可以分为多种类型,包括输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器,每种类型的迭代器支持不同的操作。
2024-03-12 16:46:02 964
原创 Linux基本指令(下)
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看。但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
2024-03-01 11:57:03 1776
原创 c++阶梯之模板初阶
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)
2024-02-28 20:19:15 842
原创 c++阶梯之内存管理
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数有这么一个类,我们分别用malloc与new来开辟该类型的空间。malloc:new:// 动态申请一个int类型的空间//动态申请连续int类型的空间接下来我们分别用 malloc与new创建一个单链表,做一个对比。
2024-02-28 16:44:41 1023
原创 c++阶梯之类与对象(下)
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。对于构造函数而言,初始化列表是对成员的初始化,而函数体内则是修改赋值。我们借用调试来看看此时Date构造函数并没有开始执行,但Date类中的成员都已经被初始化了,Time类型的构造函数已经被调用执行了。这就是因为初始化列表的存在,构造函数会先执行初始化列表。如果我们未显式实现初始化列表,那么编译器会自己生成,对内置类型不做处理,即初始化为随机数 ,自定义类型调用其默认构造函数。
2024-02-15 17:27:49 1843 1
原创 c++阶梯之类与对象(中)< 续集 >
在上文中,我们学习了类的六个默认成员函数之构造,析构与拷贝构造函数,接下来我们来看看剩下的默认成员函数。
2024-02-07 19:48:40 1525 6
原创 c++阶梯之类与对象(上)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class是c++定义类的关键字,className是类的名字,{ } 为类的主体。注意:{ } 后的分号。{ } 中的内容称为类的成员,其内定义的变量称为类的属性或成员变量,函数则称为方法或成员函数。1.声明与定义全部放入类体内 (如果函数定义在类内,则编译器有可能将函数当作内联函数处理)。2. 声明与定义分离,声明在类内放入 .h 文件,定义在类外放入 .cpp 文件。
2024-02-04 15:00:31 931 1
原创 c++阶梯之auto关键字与范围for
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。char m='*';return m;auto b = a;return 0;注意使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
2024-02-01 22:24:22 1187 1
原创 c++阶梯之引用与内联函数
指舞键盘上,悠然博弈回。如果您感兴趣,不妨看看我其他的文章,也许会有更多的收获。希望我们能在未来的日子里一起成长,共同进步。
2024-01-28 18:06:15 1003
原创 叩开c++的大门
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。
2024-01-24 18:21:23 892
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人