<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_73874574的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_73874574</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_73874574]]></copyright><item><title><![CDATA[Linux 进程信号详解]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/147349066</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/147349066</guid><author>qq_73874574</author><pubDate>Sat, 19 Apr 2025 20:16:23 +0800</pubDate><description><![CDATA[信号是进程之间事件异步通知的一种方式，属于软中断。执行kill -l 可以看到共有62种信号，其中：0-31号信号为非可靠信号（这部分信号借鉴于UNIX系统的信号）；34-64号信号为可靠信号（linux自己扩充的信号）。· 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义  #define SIGINT 2· 编号34以上的是实时信号,本文只讨论编号34以下的信号,不讨论实时信号。]]></description><category></category></item><item><title><![CDATA[Linux 进程间通信详解]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/147120429</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/147120429</guid><author>qq_73874574</author><pubDate>Sat, 19 Apr 2025 12:27:41 +0800</pubDate><description><![CDATA[管道是Unix中最古老的进程间通信的形式。· 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”它是单向的，即数据只能从一个方向流动。管道分为匿名管道和命名管道（也称为FIFO，即First In First Out）。]]></description><category></category></item><item><title><![CDATA[Linux 文件系统超详解]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/146949102</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/146949102</guid><author>qq_73874574</author><pubDate>Wed, 02 Apr 2025 17:23:59 +0800</pubDate><description><![CDATA[磁盘是计算机的主要存储介质，它可以存储大量二进制数据，即使断电后也可以保证数据不会丢失。下面我们将了解磁盘的物理结构、存储结构以及。]]></description><category></category></item><item><title><![CDATA[C++ undered_map和undered_set的封装]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/144691931</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/144691931</guid><author>qq_73874574</author><pubDate>Tue, 24 Dec 2024 13:34:50 +0800</pubDate><description><![CDATA[但是，undered_map是pair的键值对，而undered_set是一个数值，当数据传过来的时候怎么分辨呢？在需要数据的时候套一层KeyOfT，判断数据类型。]]></description><category></category></item><item><title><![CDATA[C++ 哈希]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/144532992</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/144532992</guid><author>qq_73874574</author><pubDate>Tue, 17 Dec 2024 15:06:09 +0800</pubDate><description><![CDATA[顺序结构以及平衡树中，元素关键码与其存储位置之间没有对应的关系，因此在查找一个元素时，必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)，平衡树中为树的高度，即O(log_2 N)，搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法：可以不经过任何比较，一次直接从表中得到要搜索的元素。如果构造一种存储结构，通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系，那么在查找时通过该函数可以很快找到该元素。当向该结构中：·插入元素。]]></description><category></category></item><item><title><![CDATA[C++ 红黑树]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/143978671</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/143978671</guid><author>qq_73874574</author><pubDate>Fri, 22 Nov 2024 18:49:47 +0800</pubDate><description><![CDATA[我们这里用K V的模型，为方便后续的旋转操作// 枚举定义节点颜色RED,BLACK// 存储键值对,_kv(kv),_col(RED){}这里我们给插入的节点定义为红色，是为了不违反规则4，规则4相较于规则3无异于更为严格，应为我们如果插入黑色节点一定会破坏规则4，如果插入红色节点只是可能破坏规则3，规则3可以理解为不能有连续的红色节点，因为父节点可能为黑色总的来说就是：· 插入黑色一定破坏规则4，必须调整红黑树· 插入红色可能破坏规则3，可能调整红黑树。]]></description><category></category></item><item><title><![CDATA[C++ AVL树]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/143738943</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/143738943</guid><author>qq_73874574</author><pubDate>Wed, 13 Nov 2024 16:02:10 +0800</pubDate><description><![CDATA[二叉搜索树虽可以缩短查找的效率，但如果数据有序或接近有序二叉搜索树将退化为单支树，查找元素相当于在顺序表中搜索元素，效率低下。因此，两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法：当向二叉搜索树中插入新结点后，如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整)，即可降低树的高度，从而减少平均搜索长度。一棵AVL树或者是空树，或者是具有以下性质的二叉搜索树：· 它的左右子树都是AVL树。]]></description><category></category></item><item><title><![CDATA[C++ map 和 set]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/143712544</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/143712544</guid><author>qq_73874574</author><pubDate>Tue, 12 Nov 2024 19:35:22 +0800</pubDate><description><![CDATA[前面我们介绍过STL中的部分容器，比如：vector、list、deque等，这些容器统称为序列式容器，因为其底层为线性序列的数据结构，里面存储的是元素本身。那什么是关联式容器？它与序列式容器有什么区别？关联式容器也是用来存储数据的，与序列式容器不同的是，其里面存储的是结构的，在数据检索时比序列式容器效率更高。]]></description><category></category></item><item><title><![CDATA[C++ 二叉搜索树]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/143455768</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/143455768</guid><author>qq_73874574</author><pubDate>Mon, 11 Nov 2024 12:16:46 +0800</pubDate><description><![CDATA[二叉搜索树又称二叉排序树，它或者是一棵空树，或者是具有以下性质的二叉树:·若它的左子树不为空，则左子树上所有节点的值都小于根节点的值·若它的右子树不为空，则右子树上所有节点的值都大于根节点的值·它的左右子树也分别为二叉搜索树。]]></description><category></category></item><item><title><![CDATA[C++ 多态 （详解）]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/143491244</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/143491244</guid><author>qq_73874574</author><pubDate>Tue, 05 Nov 2024 15:29:05 +0800</pubDate><description><![CDATA[在继承中要构成多态还有两个条件：1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数，且派生类必须对基类的虚函数进行重写public:cout << "买票，全价" << endl;public:cout << "买票，半价" << endl;p.BT();student st;Fan(ps);Fan(st);return 0;注意：接收对象的指针或引用，传递是父类就调用父类的函数，传递是子类就调用子类的函数。]]></description><category></category></item><item><title><![CDATA[C++ 继承]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/143440124</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/143440124</guid><author>qq_73874574</author><pubDate>Sat, 02 Nov 2024 20:12:04 +0800</pubDate><description><![CDATA[继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段，它允许程序员在保持原有类特性的基础上进行扩展，增加功能，这样产生新的类，称派生类（或子类），被继承的称基类（或父类）。继承呈现了面向对象程序设计的层次结构，体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用，继承是类设计层次的复用。]]></description><category></category></item><item><title><![CDATA[C++ Stack和Queue]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/140375870</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/140375870</guid><author>qq_73874574</author><pubDate>Wed, 30 Oct 2024 18:04:44 +0800</pubDate><description><![CDATA[1. 优先队列是一种容器适配器，根据严格的弱排序标准，它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆，在堆中可以随时插入元素，并且只能检索最大堆元素(优先队列中位于顶部的元素)。3. 优先队列被实现为容器适配器，容器适配器即将特定容器类封装作为其底层容器类，queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出，其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板，也可以是其他特定设计的容器类。]]></description><category></category></item><item><title><![CDATA[C++ List的模拟实现]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/140242504</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/140242504</guid><author>qq_73874574</author><pubDate>Sun, 07 Jul 2024 11:42:04 +0800</pubDate><description><![CDATA[比如：要访问list的第6个元素，必须从已知的位置(比如头部或者尾部)迭代到该位置，在这段位置上迭代需要线性的时间开销；list还需要一些额外的空间，以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)2. list的底层是双向链表结构，双向链表中每个元素存储在互不相关的独立节点中，在节点中通过指针指向其前一个元素和后一个元素。4. 与其他的序列式容器相比(array，vector，deque)，list通常在任意位置进行插入、移除元素的执行效率更好。]]></description><category></category></item><item><title><![CDATA[C++ Vector的模拟实现]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139888695</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139888695</guid><author>qq_73874574</author><pubDate>Sat, 22 Jun 2024 22:53:51 +0800</pubDate><description><![CDATA[就时间而言，这是一个相对代价高的任务，因为每当一个新的元素加入到容器的时候，vector并不会每次都重新分配大小。4. vector分配空间策略：vector会分配一些额外的空间以适应可能的增长，因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何，重新分配都应该是对数增长的间隔大小，以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。5. 因此，vector占用了更多的存储空间，为了获得管理存储空间的能力，并且以一种有效的方式动态增长。]]></description><category></category></item><item><title><![CDATA[Linux:文件描述符]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139843489</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139843489</guid><author>qq_73874574</author><pubDate>Thu, 20 Jun 2024 22:18:55 +0800</pubDate><description><![CDATA[每个进程都有一个指针*ﬁles, 指向一张表ﬁles_struct,该表最重要的部分就是包涵一个指针数组，每个元素都是一个指向打开文件的指针！发现是结果是： fd: 0 或者 fd: 2 可见，文件描述符的分配规则：在ﬁles_struct数组当中，找到当前没有被使用的最小的一个下标，作为新的文件描述符。此时，我们发现，本来应该输出到显示器上的内容，输出到了文件 "bite"当中，其中，fd＝1。·Linux进程默认情况下会有3个缺省打开的文件描述符，分别是标准输入0， 标准输出1， 标准错误2.]]></description><category></category></item><item><title><![CDATA[C++ String类的模拟实现]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139665491</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139665491</guid><author>qq_73874574</author><pubDate>Fri, 14 Jun 2024 21:40:52 +0800</pubDate><description><![CDATA[4. string类是basic_string模板类的一个实例，它使用char来实例化basic_string模板类，并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。5. 注意，这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列，这个类的所有成员(如长度或大小)以及它的迭代器，将仍然按照字节(而不是实际编码的字符)来操作。1. string是表示字符串的字符串类。]]></description><category></category></item><item><title><![CDATA[Liinux:进程程序替换]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139646876</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139646876</guid><author>qq_73874574</author><pubDate>Thu, 13 Jun 2024 10:31:31 +0800</pubDate><description><![CDATA[用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。·这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。·exec函数只有出错的返回值而没有成功的返回值。]]></description><category></category></item><item><title><![CDATA[Linux:进程终止和进程等待]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139636804</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139636804</guid><author>qq_73874574</author><pubDate>Wed, 12 Jun 2024 22:21:32 +0800</pubDate><description><![CDATA[WNOHANG: 若pid指定的子进程没有结束，则waitpid()函数返回0，不予以等待。·另外，进程一旦变成僵尸状态，那就刀枪不入，“杀人不眨眼”的kill -9 也无能为力，因为谁也没有办法杀死一个已经死去的进程。·如果子进程已经退出，调用wait/waitpid时，wait/waitpid会立即返回，并且释放资源，获得子进程退出信息。·如果在任意时刻调用wait/waitpid，子进程存在且正常运行，则进程可能阻塞。·子进程退出，父进程如果不管不顾，就可能造成‘僵尸进程’的问题，进而造成内存泄漏。]]></description><category></category></item><item><title><![CDATA[Linux:进程创建fork()函数详解]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139609606</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139609606</guid><author>qq_73874574</author><pubDate>Tue, 11 Jun 2024 22:15:05 +0800</pubDate><description><![CDATA[在linux中fork函数时非常重要的函数，它从进程中创建一个新进程。新进程为子进程，而原进程为父进程。返回值：自进程中返回0，父进程返回子进程id，出错返回-1分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程·添加子进程到系统进程列表当中·fork返回，开始调度器调度当一个进程调用fork之后，就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程，看如下程序。这里看到了三行输出，一行before，两行after。]]></description><category></category></item><item><title><![CDATA[C++ 内存分配管理]]></title><link>https://blog.youkuaiyun.com/qq_73874574/article/details/139551803</link><guid>https://blog.youkuaiyun.com/qq_73874574/article/details/139551803</guid><author>qq_73874574</author><pubDate>Sat, 08 Jun 2024 22:14:47 +0800</pubDate><description><![CDATA[1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数，完成对象的构造。]]></description><category></category></item></channel></rss>