- 博客(30)
- 收藏
- 关注
原创 LinuxI/O多路转接
基础知识阻塞与非阻塞阻塞调用是指调用结果返回之前,当前线程会被挂起. 调用线程只有在得到结果之后才会返回非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程同步通信 vs 异步通信同步:调用者发出调用时,没有得到结果不会返回,阻塞等待,调用者主动等待该调用结果异步:与同步相反,发出调用后立即返回,调用内的工作由别人完成,等待被调用者的通知,直接使用,自己并不参与非阻塞IO一个文件描述符, 默认都是阻塞IOint fcntl(int fd, int cmd, … /* arg */
2022-04-14 10:50:33
1967
32
原创 传输层TCP与UDP
传输层负责数据能够从发送端传输接收端,进程到进程再谈端口号在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信端口号范围划分0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的我们自己写一个程序使用端口号时, 要避开这些知名端口号pidof
2022-03-28 11:49:05
10434
32
原创 HTTP协议
URI和URLURI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源URL,就是输入的网页地址,是uniform resource locator,统一资源定位符,它是一种具体的URI,URL表示互联网中资源的地点...
2022-03-16 10:58:33
10515
25
原创 网络套接字编程
端口号端口号(port)是传输层协议的内容端口号是一个2字节16位的整数;一个端口号只能被一个进程占用端口号用来标识一台主机内的唯一一个进程,公网IP标识全网内唯一一个进程,ip+port:标识全网内的唯一一个进程一台机器当中一个端口号可以唯一标识一个进程。而一个进程可以占用多个端口进程pid与port的关系在OS中,并不是所有的进程都需要进行网络通信,pid标识系统里的一个进程,port标识进行网络通信的一个进程pid是系统级别的概念,port是网络的概念网络字节序内存中的多字节数
2022-03-14 20:13:55
4218
23
原创 C++智能指针
RAIIRAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源我们实际上把管理一份资源的责任托付给了一个对象。这种做法有两大好处:1.不需要显式地释放资源2.采用这种方式,对象所需的资源在其生命期内始终保持有效典型的应用有智能指针和lock_guard智能指针智能指针除了具有RAII特性外,还需要像指针
2022-03-10 11:06:49
974
25
原创 C++11
列表初始化{}的初始化问题C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加#include<iostream>using namespace std;class Date{public: Date(int year = 0, int month = 1, int day = 1) :_year(year) , _month(month) , _day(day) {
2022-03-07 20:36:24
850
16
原创 Linux进程间通信
概念进程间通信本质让不同的进程,看到同一份资源内存,文件内核缓冲等)资源由谁(os中的那些模块)提供,就有了不同的进程如何实现进程间通信1.进程之间是具有独立性的,所以难以直接通信2…进程间通信,一般一定要借助第三方(OS)资源3.通信的本质就是”数据的拷贝“进程A->数据"拷贝"给OS的一段内存区域->OS数据"拷贝"给进程B这样通过OS这个“媒介”就实现了进程A与进程B的通信进程通信的目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资
2022-02-15 14:39:14
2578
21
原创 线程的互斥与同步
线程的互斥相关概念:临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成简单的抢票程序 #include<stdio.h> #include<unistd.h> #include<pthread.h> #inclu
2022-02-12 14:15:40
4723
20
原创 线程与线程控制
线程线程定义Linux中的所有执行流,都叫做轻量级进程(LWP),轻量级进程又叫线程线程在进程内部运行:线程在进程地址空间内运行在Linux中,站在CPU的角度,能否识别该task_struct是进程还是线程?不能,CPU不需要识别,CPU只关心一个一个的单个执行流,每个task_struct就是一个执行流在CPU眼中的task_struct<=OS原理的tas
2022-02-09 09:38:38
1337
18
原创 室友竟只在2021的最后一天就学会了哈希表
哈希概念通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)映射方式1.直接定址法用数组与数据的相对映射或绝对位置建立索引关系,此时增删查改时间复杂度O(1)缺陷:1.如果数据范围很大,直接定制法会浪费大量的空间2.不能处理字符串,浮点数等数据,无法被拿来作为数组的索引适用于:整数,并且数据集中的情况2
2021-12-31 16:51:06
3559
24
原创 进程的控制
进程创建fork深挖对于返回值:为何要给子进程返回0,给父进程返回子进程的pid?父进程:子进程为1:n的关系,父进程创建子进程通常是要执行任务的,这时候,存在多个子进程执行不同的任务,父进程就需要区分不同的子进程所以就会通过返回子进程pid的方式返回给父进程对于fork分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回,开始调度器调度所以在fork内部,就已经出现了两个执行流,这样才会返回两个返回值fork之后谁先运
2021-12-14 20:03:28
800
16
原创 进程与环境变量
冯诺依曼体系结构可以看出:1.站在硬件角度和数据层面上,CPU只和内存“交流”,外设只和内存"交流"2.数据要处理必须预装载到内存,局部性原理,这个过程由OS完成这就回答了为什么程序运行之前要加载内存?程序本质上是文件,位于硬盘(外设)上,想到CPU运行,必须经过内存操作系统操作系统:软硬件资源的管理者操作系统不会和软硬件打交道,通过驱动拿到资源(数据)操作系统要对拿到的数据管理必须先描述再组织描述:用结构体来对其描述组织:选用适宜的数据结构存储所以操作系统对软硬件的管理
2021-12-09 14:42:53
1063
13
原创 map,set底层数据结构红黑树
红黑树的概念①红黑树与AVL树一样都是平衡二叉搜索树②通过从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点的限制,确保没有一条路径会比其他路径长出俩倍,因而是接近平衡红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的(没有连续的红结点)对于每个结点,从该结点到其所有后代叶结点的简单路径上,包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)红黑树的极端情况针对第三点我们很容易想到两种极端情况
2021-12-03 16:53:13
2690
9
原创 Linux进程信号
信号概述像上课铃声这种信号,我们识别接收后,知道该上课了,这是我们后天学习养成的默认意识。在进程收到信号后,它是知道该怎么做的 ,程序员内置了默认的处理行为进程的运行跟信号的产生属于异步关系:1.进程不一定立刻去处理已经到来的信号2.如果进程在处理优先级更高的事情,可以暂时不处理信号,等到合适的时候再处理。3.会用某种方式记录下已经到来的但没处理的信号,以便在空闲的时候处理这些信号异步:二者之间互不影响同步:二者之间相互影响处理信号的三种方式:1.默认行为2.提供信号处理函数,要求
2021-11-13 20:08:02
2019
12
原创 C++多态二三事
1. 多态的概念多态:多种形态;不同的对象完成同一件事情会发生不同的行为,产生不同的结果多态包括静态的多态:函数重载(静态指编译时)动态的多态:父类指针或引用调用重写了的虚函数(是指运行时)2.多态的定义和实现构成多态还需要两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写虚函数:即被virtual修饰的类非静态成员函数称为虚函数静态没有this指针,无法形成切片,那就无法调用派生类重写了的虚函数,无法形成多态虚函数是
2021-10-29 19:56:20
1065
8
原创 C++继承二三事
继承定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类继承是is a的关系,子类(派生类)继承了父类(基类),子类拥有和父类一样的属性:所以子类可以使用父类的方法,父类的成员变量也拷贝到了子类:情况一:意义变了在Linux环境下:示例:在vs2019环境下:可以看到pos是在插入30之前给的值,插入后,可以认为pos就失效了,在vs2019环境下,插入后pos的意义变了,pos指向的是30,不再是3,导致erase(pos)没有达到删除3的目的,程序崩溃而在Linux环境下,“正常运行”,因为不同库的所执行的标准不同,检查机制也不一样,vs检查比Linux严格情况二:野指针只讲程序又插入了一个数据6,程序也崩了,但这原
2021-10-09 15:26:23
625
5
原创 Linux环境基础开发工具使用
Linux 软件包管理器yum软件包和软件包管理器, 就好比手机上的"App" 和 “应用商店”所以yum的作用主要是在Linux下安装软件注意:关于 yum 的所有操作必须保证主机(虚拟机)网络畅通yum的三板斧查看软件包通过yum list 命令可以罗列出当前一共有哪些软件包我们可以使用grep命令筛选出我们需要的包例如:yum list | grep lrzsz软件名"lrzsz"“x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择
2021-10-08 14:43:00
6184
6
原创 Linux的权限问题
这里写目录标题Linux下用户权限权限提升问题su命令:Linux权限管理①文件访问者的分类②文件类型③权限属性文件权限值的表示方法文件权限的修改chmod关于目录权限对拥有者和所属组的修改默认权限值修改初始权限值:粘滞位Linux下用户权限Linux下有两种用户:超级用户(root)、普通用户:超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”权限提升问题su命令:格式:su [-][用户名
2021-10-04 17:36:50
754
6
原创 C++类与对象
类的介绍:1.类的简单介绍class className{ // 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。2.类的作用域类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符 指明成员属于哪个类域。示例:#incl
2021-09-30 10:47:46
469
17
原创 集合背后的数据结构(一)
集合介绍可以看到集合类的基本接口是Collection接口,而Collection接口继承了Iterable接口:这个接口内部只有一个方法**public abstract Iterator iterator();**而这个迭代器对象依次访问集合中的元素接下来让我跟你们介绍一下迭代器Iterator:hasnext()方法:集合中有元素的时候返回true,否则返回false;next()方法:首先迭代器指向第一个元素的前面的空白部分,调用next后迭代器越过下一个元素,并且返回这个元素的引用;
2021-09-24 16:41:03
538
11
原创 深入解析字符串的“==“比较原理
String的比较如果我们用equals方法从原码可以看出,比较的是字符串的内容public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject;
2021-09-15 21:25:24
1659
8
原创 动态内存通讯录
contact.h#pragma once#define _CRT_SECURE_NO_WARNINGS#include<stdlib.h>#include<stdio.h>#include<string.h>#define MAX_NAME 20#define MAX_SEX 10#define MAX_TELE 12#define MAX_ADDR 30#define MAX 1000#define DEFAULT_SZ 3#define IN
2021-07-20 21:25:05
624
3
原创 字符函数和字符串函数
字符函数和字符串函数长度不受限制的字符串函数1. strlen(求字符串长度,直到'\0'停止)2. strcpy(拷贝字符串)3. strcat(字符串追加)4.strcmp(字符串比较)长度受限制的字符串函数1. strncpy(拷贝num个字符从源字符串到目标空间)2. strncat(追加num个字符)3.strncmp(比较前num个字符)4. strstr(字符串的查找)5.strtok(分割字符串)6.strerror(返回错误码,所对应的错误信息)长度不受限制的字符串函数1. strle
2021-07-16 11:15:15
156
1
原创 结构体内存对齐
结构体的对齐规则:第一个成员在与结构体变量偏移量为0的地址处。其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。结构体总大小为**最大对齐数(每个成员变量都有一个对齐数)的整数倍。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的值为8Linux没有具体默认对齐数为什么存在内存对齐?平台原因(移植原因): 不是所有的硬件平台
2021-07-11 15:02:54
349
1
原创 C++string容器详解
文章目录1.概述:2.string的构造函数3.string的赋值操作4.string的拼接操作5.string的子串获取操作6.string的插入与删除7.string的替换与查找字符操作8.string的字符串比较操作与尾插操作9.string字符存取操作1.概述:string是C++风格的字符串,而string本质上是一个类string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是用char*表示的。string与char*都可以用来表示字符串,不过二者之间也有
2021-04-11 16:03:39
3633
20
原创 C++多态详解
多态概述多态是C++面向对象三大特性之一多态分为两类:静态多态动态多态函数重载和运算符重载属于静态多态,复用函数名派生类和虚函数实现运行时多态静态多态的函数地址早绑定动态多态的函数地址晚绑定示例:#include<iostream>using namespace std;//动物类class Animal{public://虚函数 virtual void speak() { cout << "Animal在说话" &l
2021-04-03 10:58:27
1172
4
原创 C++构造函数与析构函数
构造函数与析构函数概述C++中用构造函数和析构函数来初始化和清理对象,这两个函数将会被编译器自动调用。对象的初始化和清理是非常重要的,如果我们不提供构造函数与析构函数,编译器会自动提供两个函数的空实现。构造函数:主要作用于创建函数时对对象成员的属性赋值。析构函数:主要作用于在对象销毁前,执行一些清理工作(如释放new开辟在堆区的空间)。构造函数语法:类名(){}1.构造函数,没有返回值也不写void2.函数名称与类名相同3.构造函数可以有参数,因此可以发生重载4.程序在调用对象时候会自动调用
2021-04-01 15:58:57
563
2
原创 C++函数重载
函数重载概述定义:函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数作用:减少函数名数量,提高复用性函数重载的条件1.同一作用域下2.函数名称相同3.函数参数类型不同,或者个数不同,或者顺序不同注意:函数返回值不同不能当做重载条件示例:#include<iostream>using namespace std;void test(){ cout << "1.调用test()" << endl;}v
2021-03-31 20:14:34
1033
2
原创 C++引用详解
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片拖拽 功能,你可以将本地的图片直
2021-03-29 19:46:49
1238
14
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人