<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[hbbfvv1h的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/hbbfvv1h</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; hbbfvv1h]]></copyright><item><title><![CDATA[LinuxI/O多路转接]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/124066295</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/124066295</guid><author>hbbfvv1h</author><pubDate>Thu, 14 Apr 2022 10:50:33 +0800</pubDate><description><![CDATA[基础知识
阻塞与非阻塞
阻塞调用是指调用结果返回之前，当前线程会被挂起. 调用线程只有在得到结果之后才会返回
非阻塞调用指在不能立刻得到结果之前，该调用不会阻塞当前线程
同步通信 vs 异步通信
同步：调用者发出调用时，没有得到结果不会返回，阻塞等待，调用者主动等待该调用结果
异步：与同步相反，发出调用后立即返回，调用内的工作由别人完成，等待被调用者的通知，直接使用，自己并不参与
非阻塞IO
一个文件描述符, 默认都是阻塞IO

int fcntl(int fd, int cmd, … /* arg */ ]]></description><category></category></item><item><title><![CDATA[传输层TCP与UDP]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123567591</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123567591</guid><author>hbbfvv1h</author><pubDate>Mon, 28 Mar 2022 11:49:05 +0800</pubDate><description><![CDATA[传输层
负责数据能够从发送端传输接收端，进程到进程
再谈端口号
在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信

端口号范围划分
0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.
1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的
我们自己写一个程序使用端口号时, 要避开这些知名端口号
pidof
]]></description><category></category></item><item><title><![CDATA[HTTP协议]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123480022</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123480022</guid><author>hbbfvv1h</author><pubDate>Wed, 16 Mar 2022 10:58:33 +0800</pubDate><description><![CDATA[URI和URL
URI,是uniform resource identifier，统一资源标识符，用来唯一的标识一个资源
URL,就是输入的网页地址，是uniform resource locator，统一资源定位符，它是一种具体的URI，URL表示互联网中资源的地点

...]]></description><category></category></item><item><title><![CDATA[网络套接字编程]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122838786</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122838786</guid><author>hbbfvv1h</author><pubDate>Mon, 14 Mar 2022 20:13:55 +0800</pubDate><description><![CDATA[端口号
端口号(port)是传输层协议的内容
端口号是一个2字节16位的整数;
一个端口号只能被一个进程占用
端口号用来标识一台主机内的唯一一个进程，公网IP标识全网内唯一一个进程，ip+port：标识全网内的唯一一个进程
一台机器当中一个端口号可以唯一标识一个进程。而一个进程可以占用多个端口

进程pid与port的关系
在OS中，并不是所有的进程都需要进行网络通信，pid标识系统里的一个进程，port标识进行网络通信的一个进程
pid是系统级别的概念，port是网络的概念

网络字节序
内存中的多字节数]]></description><category></category></item><item><title><![CDATA[C++智能指针]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123344630</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123344630</guid><author>hbbfvv1h</author><pubDate>Thu, 10 Mar 2022 11:06:49 +0800</pubDate><description><![CDATA[RAII

RAII（Resource Acquisition Is Initialization）是一种利用对象生命周期来控制程序资源的简单技术。

在对象构造时获取资源，接着控制对资源的访问使之在对象的生命周期内始终保持有效，最后在对象析构的时候释放资源
我们实际上把管理一份资源的责任托付给了一个对象。这种做法有两大好处：
1.不需要显式地释放资源
2.采用这种方式，对象所需的资源在其生命期内始终保持有效
典型的应用有智能指针和lock_guard
智能指针
智能指针除了具有RAII特性外，还需要像指针]]></description><category></category></item><item><title><![CDATA[C++11]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123032436</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/123032436</guid><author>hbbfvv1h</author><pubDate>Mon, 07 Mar 2022 20:36:24 +0800</pubDate><description><![CDATA[列表初始化
{}的初始化问题
C++11扩大了用大括号括起的列表(初始化列表)的使用范围，使其可用于所有的内置类型和用户自定义的类型，使用初始化列表时，可添加等号(=)，也可不添加
#include&lt;iostream&gt;
using namespace std;

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{]]></description><category></category></item><item><title><![CDATA[Linux进程间通信]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122895652</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122895652</guid><author>hbbfvv1h</author><pubDate>Tue, 15 Feb 2022 14:39:14 +0800</pubDate><description><![CDATA[概念
进程间通信本质让不同的进程，看到同一份资源内存，文件内核缓冲等)
资源由谁（os中的那些模块）提供，就有了不同的进程
如何实现进程间通信
1.进程之间是具有独立性的，所以难以直接通信
2…进程间通信，一般一定要借助第三方(OS)资源
3.通信的本质就是”数据的拷贝“
进程A-&gt;数据"拷贝"给OS的一段内存区域-&gt;OS数据"拷贝"给进程B
这样通过OS这个“媒介”就实现了进程A与进程B的通信
进程通信的目的
数据传输：一个进程需要将它的数据发送给另一个进程
资源共享：多个进程之间共享同样的资]]></description><category></category></item><item><title><![CDATA[线程的互斥与同步]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122776219</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122776219</guid><author>hbbfvv1h</author><pubDate>Sat, 12 Feb 2022 14:15:40 +0800</pubDate><description><![CDATA[线程的互斥

相关概念：
临界资源：多线程执行流共享的资源就叫做临界资源
临界区：每个线程内部，访问临界资源的代码，就叫做临界区
互斥：任何时刻，互斥保证有且只有一个执行流进入临界区，访问临界资源，通常对临界资源起保护作用
原子性：不会被任何调度机制打断的操作，该操作只有两态，要么完成，要么未完成

简单的抢票程序
    #include&lt;stdio.h&gt;
    #include&lt;unistd.h&gt;
    #include&lt;pthread.h&gt;
    #inclu]]></description><category></category></item><item><title><![CDATA[线程与线程控制]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122759664</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/122759664</guid><author>hbbfvv1h</author><pubDate>Wed, 09 Feb 2022 09:38:38 +0800</pubDate><description><![CDATA[线程
线程定义
Linux中的所有执行流，都叫做轻量级进程（LWP），轻量级进程又叫线程
线程在进程内部运行:线程在进程地址空间内运行

在Linux中，站在CPU的角度，能否识别该task_struct是进程还是线程？
不能，CPU不需要识别，CPU只关心一个一个的单个执行流，每个task_struct就是一个执行流
在CPU眼中的task_struct&lt;=OS原理的tas]]></description><category></category></item><item><title><![CDATA[室友竟只在2021的最后一天就学会了哈希表]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121953059</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121953059</guid><author>hbbfvv1h</author><pubDate>Fri, 31 Dec 2021 16:51:06 +0800</pubDate><description><![CDATA[哈希概念
通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系，那么在查找时通过该函数可以很快找到该元素
哈希方法中使用的转换函数称为哈希(散列)函数，构造出来的结构称为哈希表(Hash Table)(或者称散列表)
映射方式
1.直接定址法
用数组与数据的相对映射或绝对位置建立索引关系，此时增删查改时间复杂度O（1）
缺陷：
1.如果数据范围很大，直接定制法会浪费大量的空间
2.不能处理字符串，浮点数等数据，无法被拿来作为数组的索引
适用于：整数，并且数据集中的情况

2]]></description><category></category></item><item><title><![CDATA[进程的控制]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121884446</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121884446</guid><author>hbbfvv1h</author><pubDate>Tue, 14 Dec 2021 20:03:28 +0800</pubDate><description><![CDATA[进程创建
fork深挖
对于返回值：为何要给子进程返回0，给父进程返回子进程的pid？
父进程：子进程为1：n的关系，父进程创建子进程通常是要执行任务的，这时候，存在多个子进程执行不同的任务，父进程就需要区分不同的子进程
所以就会通过返回子进程pid的方式返回给父进程
对于fork

分配新的内存块和内核数据结构给子进程
将父进程部分数据结构内容拷贝至子进程
添加子进程到系统进程列表当中
fork返回，开始调度器调度


所以在fork内部，就已经出现了两个执行流，这样才会返回两个返回值
fork之后谁先运]]></description><category></category></item><item><title><![CDATA[进程与环境变量]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121741788</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121741788</guid><author>hbbfvv1h</author><pubDate>Thu, 09 Dec 2021 14:42:53 +0800</pubDate><description><![CDATA[冯诺依曼体系结构


可以看出：
1.站在硬件角度和数据层面上，CPU只和内存“交流”,外设只和内存"交流"
2.数据要处理必须预装载到内存，局部性原理，这个过程由OS完成

这就回答了为什么程序运行之前要加载内存？
程序本质上是文件，位于硬盘（外设）上，想到CPU运行，必须经过内存
操作系统
操作系统：软硬件资源的管理者


操作系统不会和软硬件打交道，通过驱动拿到资源（数据）
操作系统要对拿到的数据管理必须先描述再组织
描述：用结构体来对其描述
组织：选用适宜的数据结构存储

所以操作系统对软硬件的管理]]></description><category></category></item><item><title><![CDATA[map，set底层数据结构红黑树]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121578904</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121578904</guid><author>hbbfvv1h</author><pubDate>Fri, 03 Dec 2021 16:53:13 +0800</pubDate><description><![CDATA[红黑树的概念

①红黑树与AVL树一样都是平衡二叉搜索树
②通过从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点的限制，确保没有一条路径会比其他路径长出俩倍，因而是接近平衡

红黑树的性质


每个结点不是红色就是黑色
根节点是黑色的
如果一个节点是红色的，则它的两个孩子结点是黑色的(没有连续的红结点)
对于每个结点，从该结点到其所有后代叶结点的简单路径上,包含相同数目的黑色结点
每个叶子结点都是黑色的(此处的叶子结点指的是空结点)


红黑树的极端情况
针对第三点我们很容易想到两种极端情况
]]></description><category></category></item><item><title><![CDATA[Linux进程信号]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121274953</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/121274953</guid><author>hbbfvv1h</author><pubDate>Sat, 13 Nov 2021 20:08:02 +0800</pubDate><description><![CDATA[信号概述
像上课铃声这种信号，我们识别接收后，知道该上课了，这是我们后天学习养成的默认意识。
在进程收到信号后，它是知道该怎么做的 ，程序员内置了默认的处理行为
进程的运行跟信号的产生属于异步关系:
1.进程不一定立刻去处理已经到来的信号
2.如果进程在处理优先级更高的事情，可以暂时不处理信号，等到合适的时候再处理。
3.会用某种方式记录下已经到来的但没处理的信号，以便在空闲的时候处理这些信号

异步：二者之间互不影响
同步：二者之间相互影响

处理信号的三种方式：
1.默认行为
2.提供信号处理函数，要求]]></description><category></category></item><item><title><![CDATA[C++多态二三事]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120972454</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120972454</guid><author>hbbfvv1h</author><pubDate>Fri, 29 Oct 2021 19:56:20 +0800</pubDate><description><![CDATA[1. 多态的概念
多态：多种形态；不同的对象完成同一件事情会发生不同的行为，产生不同的结果

多态包括
静态的多态：函数重载（静态指编译时）
动态的多态：父类指针或引用调用重写了的虚函数（是指运行时）

2.多态的定义和实现
构成多态还需要两个条件：

必须通过基类的指针或者引用调用虚函数
被调用的函数必须是虚函数，且派生类必须对基类的虚函数进行重写


虚函数：即被virtual修饰的类非静态成员函数称为虚函数

静态没有this指针，无法形成切片，那就无法调用派生类重写了的虚函数，无法形成多态
虚函数是]]></description><category></category></item><item><title><![CDATA[C++继承二三事]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120959839</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120959839</guid><author>hbbfvv1h</author><pubDate>Tue, 26 Oct 2021 14:30:05 +0800</pubDate><description><![CDATA[继承定义

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段，它允许程序员在保持原有类特性的基础上进行扩展，增加功能，这样产生新的类，称派生类

继承是is a的关系，子类（派生类）继承了父类（基类），子类拥有和父类一样的属性：
所以子类可以使用父类的方法，父类的成员变量也拷贝到了子类![在这里插入图片描述](https://img-

定义格式
        派生类       继承方式   基类 

class subclass : public   parentcla]]></description><category></category></item><item><title><![CDATA[迭代器失效问题]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120669434</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120669434</guid><author>hbbfvv1h</author><pubDate>Sat, 09 Oct 2021 15:26:23 +0800</pubDate><description><![CDATA[迭代器指针失效的两种情况：
案例一(insert)：
情况一：意义变了
在Linux环境下：
示例：


在vs2019环境下：


可以看到pos是在插入30之前给的值，插入后，可以认为pos就失效了,
在vs2019环境下，插入后pos的意义变了,pos指向的是30，不再是3，导致erase(pos)没有达到删除3的目的，程序崩溃
而在Linux环境下，“正常运行”,因为不同库的所执行的标准不同，检查机制也不一样，vs检查比Linux严格
情况二：野指针

只讲程序又插入了一个数据6，程序也崩了，但这原]]></description><category></category></item><item><title><![CDATA[Linux环境基础开发工具使用]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120628734</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120628734</guid><author>hbbfvv1h</author><pubDate>Fri, 08 Oct 2021 14:43:00 +0800</pubDate><description><![CDATA[Linux 软件包管理器yum
软件包和软件包管理器, 就好比手机上的"App" 和 “应用商店”
所以yum的作用主要是在Linux下安装软件
注意：
关于 yum 的所有操作必须保证主机(虚拟机)网络畅通
yum的三板斧
查看软件包
通过yum list 命令可以罗列出当前一共有哪些软件包
我们可以使用grep命令筛选出我们需要的包
例如：
yum list | grep lrzsz


软件名"lrzsz"
“x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择]]></description><category></category></item><item><title><![CDATA[Linux的权限问题]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120603001</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120603001</guid><author>hbbfvv1h</author><pubDate>Mon, 04 Oct 2021 17:36:50 +0800</pubDate><description><![CDATA[这里写目录标题Linux下用户权限权限提升问题su命令：Linux权限管理①文件访问者的分类②文件类型③权限属性文件权限值的表示方法文件权限的修改chmod关于目录权限对拥有者和所属组的修改默认权限值修改初始权限值：粘滞位

Linux下用户权限
Linux下有两种用户：超级用户（root）、普通用户：
超级用户：可以再linux系统下做任何事情，不受限制
普通用户：在linux下做有限的事情。
超级用户的命令提示符是“#”，普通用户的命令提示符是“$”
权限提升问题
su命令：
格式：su [-][用户名]]></description><category></category></item><item><title><![CDATA[C++类与对象]]></title><link>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120508713</link><guid>https://blog.youkuaiyun.com/hbbfvv1h/article/details/120508713</guid><author>hbbfvv1h</author><pubDate>Thu, 30 Sep 2021 10:47:46 +0800</pubDate><description><![CDATA[类的介绍：
1.类的简单介绍
class className{ 
	// 类体：由成员函数和成员变量组成

 }; // 一定要注意后面的分号

class为定义类的关键字，ClassName为类的名字，{}中为类的主体，注意类定义结束时后面分号。
类中的元素称为类的成员：类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
2.类的作用域
类定义了一个新的作用域，类的所有成员都在类的作用域中。
在类体外定义成员，需要使用 :: 作用域解析符 指明成员属于哪个类域。
示例：
#incl]]></description><category></category></item></channel></rss>