自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 项目2-云备份

项目名称:云备份项目简介:搭建云备份服务端与客户端,实现客户端针对主机上特定目录下的文件自动进行备份到云端,服务器端会对上传的文件进行热点文件判断,对于非热点文件进行压缩存储节省磁盘空间,并且服务器端支持通过浏览器进行查看与下载以及断点续传功能,整个传输过程支持ssl加密传输。概要设计: 客户端模块:windows下的客户端程序 功能需求:自动对指定目录下的文件进行备份 模块划分: ...

2021-10-11 10:48:41 285 1

原创 项目1-点餐系统

项目名称:点餐系统项目描述:使用户可以通过浏览器访问服务器获取菜品信息并进行点餐;以及可以使管理员通过浏览访问服务器实现订单以及菜品的管理市场调研:整合所学知识技术调研:线程,socket,http,json,mysql,stl概要设计:框架的设计---不太严谨的MVC框架 model:数据管理模块---管理数据(菜品,订单),外界想要访问数据必须通过这个模块完成,不能直接访问 view:视图界面模块---浏览器前端界面,用户或者管理员的操...

2021-10-11 10:48:18 1229

原创 Linux高级IO(典型IO方式、多路转接模型)

高级IO:四种典型IO方式,多路转接IO四种典型IO方式: IO:输入输出(需要经历两个过程---等待IO就绪,进行数据拷贝) 典型IO:阻塞IO,非阻塞IO,信号驱动IO,异步IO 1.阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则一直等待优点 :流程最为简单; 缺点:效率较为低下 2.非阻塞IO:发起IO调用,若IO未就绪,...

2021-09-27 10:16:28 395

原创 Linux网络基础5(链路层---以太网)

链路层:负责相邻设备之间的数据传输以太网协议:ethernet协议格式: 48位源端-对端mac地址:识别指定相邻设备 mac地址:uint8_t mac[6]---网卡的物理硬件地址,在出厂时设定 16位数据类型:用于数据分用时上层解析协议的选择 32位数据帧尾:校验和进行差错校验...如何获取相邻指定设备的MAC地址:ARP协议ARP协议:介于网络层与链路层之...

2021-09-21 12:02:16 362

原创 Linux网络基础4(网络层---IP)

网络层:负责地址管理与路由选择---IP协议,地址管理,路由选择IP协议:4位协议版本:4-ipv4协议版本4位头部长度:以4字节为单位 8位服务类型:3位优先权弃用,4位TOS,1位固定为0 16位数据报长度:IP报文最大大小为64k,udp报文中数据最大大小 < 64k - 28 16位分片标识:标识分片属于哪个报文 3位分片标志:1位保留,1位禁止分片,1位分片结束标...

2021-09-18 20:27:51 179

原创 Linux网络基础3(传输层---TCP/UDP)

传输层:负责应用程序之间的数据传输---TCP/UDPUDP: 协议实现:16位源端-对端端口:用于描述识别通信两端进程16位数据报长度:能够存储最大数字65535---udp报文总大小最大不能超过64k16位校验和:采用二进制反码求和算法---校验接收方接收到的数据与发送方发送的数据是否一致协议特性: 无连接:通信时不需要建立连接,...

2021-09-17 11:36:26 513

原创 Linux网络基础2(应用层---HTTP/HTTPS)

针对TCP/IP四层模型中各层的典型协议进行解析应用层:应用层负责应用程序之间的沟通---程序员自己定义数据的组织格式应用层协议:如何将多个数据对象组织成为一个二进制数据串进行传输(自定制协议---程序员自己定制的数据格式;知名协议---HTTP)自定制协议:程序员自定制数据格式,定制的同时需要考虑传输性能、解析性能以及调试便捷性,如何组织更加适用当前的应用场景。序列化:将数据对象按照指定协议进行组织实现持久化存储或者网络通信传输的二进制数据串的过程反序列化:按照指定协议,将..

2021-09-14 12:11:39 149

原创 模拟实现vector类

#include<iostream>#include<assert.h>using namespace std;template<class T>class Vector{public: //迭代器类型: T* typedef T* iterator; typedef const T* const_iterator; Vector() :_start(nullptr) , _finish(nullptr) , _endOfStorag.

2021-08-18 17:25:54 120

原创 模拟实现string类

class String {public: //String的迭代器操作类似于指针,是通过字符指针实现的 typedef char* iterator; typedef const char* const_iterator; iterator begin() { //第一个元素的位置 return _data; } iterator end() { //最后一个元素的下一个位置 return _data + _size; } const_iterator beg.

2021-07-30 14:59:25 58

原创 string类的深浅拷贝(传统与现代写法)

经典写法://经典写法class String{public: //全缺省构造函数 String(const char* str = "") :_data(new char[strlen(str) + 1]) { strcpy(_data, str); } //浅拷贝(编译器默认生成的拷贝构造函数) //浅拷贝只拷贝String中的内容,析构时可能会造成同一份资源的二次释放 //赋值时还可能造成被赋值对象之前的资源泄漏 /*String(const String&amp

2021-07-28 18:43:16 110

原创 Linux套接字编程(udp通信、tcp通信)

socket套接字编程:网络通信程序的编写(接口+流程)udp协议:用户数据报协议特性:无连接,不可靠,面向数据报应用场景:实时性要求大于安全性要求的场景---视频传输tcp协议:传输控制协议特性:面向连接,可靠传输,面向字节流应用场景:安全性要求大于实时性要求的场景---文件传输在网络通信程序中,通信两端被分为:客户端,服务器端客户端:通常是提供给客户的通信端,通常是编写通信程序中主动发起请求的一端服务端:通常指被动接受请求,提供服务的通信端客户端...

2021-06-10 16:36:06 478 2

原创 Linux网络基础1(发展背景、ip地址、端口、通信协议、网络字节序)

网络基础1:发展背景、ip地址、端口、通信协议、网络字节序局域网,城域网、广域网:根据网络覆盖范围进行的网络划;互联网、因特网:相同的东西不用的叫法(国际性的更大的广域网);以太网、令牌环网:组网技术...

2021-05-26 16:42:56 126

原创 Linux多线程3(线程应用——线程池、线程安全单例模式)

线程应用:线程池,线程安全的单例模式线程池:对于生产者与消费者模型最为典型的应用创建一堆工作线程(有最大数量限制)以及一个线程安全的任务队列,这些工作线程不断从任务队列中取出任务进行处理。优点:避免资源无限制使用所造成的资源耗尽的风险;避免频繁大量的线程创建与销毁带来的时间成本。实现:(1)直接在线程入口函数中定义好各种不同类型的处理方法(2)要处理什么数据,这个数据如何处理都由外部传入class ThreadTask(数据,处理数据的函数)class ThreadPool(有数量上限的线程

2021-05-24 16:38:18 110

原创 Linux多线程1(线程概念、线程控制)

多线程:线程概念、线程控制、线程安全、设计模式1.线程概念:一个进程中可以有一个或多个线程,线程是进程中的一条执行流,是cpu调度的基本单元,负责进程中一段代码的运行调度。在linux下,线程是通过pcb实现的,一个进程中可以有多个pcb,这些pcb共享进程中的大部分资源,因此也被称作轻量级进程。进程是系统进行资源分配的基本单元。线程与进程的关键性区别:进程是系统进行资源分配的基本单元线程是系统进行运行调度的基本单元线程间的独有与共享:独有:标识符,栈,寄存器,信号屏蔽字,errno…共享:虚

2021-05-24 11:20:04 117

原创 Linux多线程2(线程安全——同步与互斥、生产者消费者模型、信号量)

线程安全:线程中对临界资源的访问操作是安全的临界资源:公共资源,大家都能访问到的资源线程安全的实现:同步与互斥互斥:通过同一时间只有一个线程能够访问资源实现资源访问的安全性同步:通过条件判断让线程对临界资源访问更加合理有序互斥的实现:互斥锁(通过互斥锁保护线程对临界资源的访问操作不会被打断)本质:是一个只有0/1的计数器原理:标记临界资源的两种访问状态,可访问或者不可访问。在线程访问临界资源之前,先进行互斥锁加锁操作。(判断是否可访问,可访问则返回,不可访问则阻塞)在线程访问临界资源完毕之后

2021-05-23 15:52:32 272

原创 Linux进程信号

进程信号:是一种中断机制,或者说是一种时间通知机制,这里指的是软件中断。通过信号通知进程发生了某个事件,打断进程当前的操作,去处理事件。一个信号对应一个事件,并且信号必须能够被识别。注意:信号量不是信号,这两个不是同一个东西。linux下信号种类:使用kill -l命令进行查看,一共62种1~31号:非可靠信号34~64号:可靠信号信号的生命周期:产生,注册,注销,处理产生硬件产生:ctrl+c(解释出的软件信号为2号信号SIGINT中断信号)、ctrl+\(转换为3号信号SIGQUIT退

2021-05-13 18:37:55 218

原创 Linux进程间通信

进程间通信:操作系统为进程间能够进行通信所提供的几种方式。每个进程都有自己的虚拟地址空间,访问的都是虚拟地址,因此进程之间具有独立性,无法直接通信。进程间通信的原理:系统为进程间提供一个公共的传输媒介实现公共访问从而实现通信。根据通信需求不同提供了不同方式:管道,共享内存,消息队列,信号量管道特性:半双工通信—可以选择方向的单向通信本质:系统内核中的一块缓冲区(内核空间中开辟的一块内存)通信原理:多个进程只要能够访问同一块内核中的缓冲区(管道)就能实现通信分类:匿名管道(只能用于具有亲缘

2021-05-10 23:02:05 289 2

原创 Linux利用匿名管道模拟实现ps -ef | grep+字符串的命令

管道:| 连接两个命令,将前边命令进程要输出到标准输出的结果,不再输出到标准输出,而是将这个数据传输到后边的命令进程ps -ef | grep pipeps -ef:将所有进程信息写入到标准输出grep pipe:不断循环从标准输入读取数据进行字符串匹配过滤shell进程中创建两个进程,一个进程运行ps,一个进程运行grep要将ps进程的数据,交给grep进程只能通过进程间通信完成—匿名管道1.创建管道2.创建两个进程,在各自进程中进行程序替换3.在程序替换之前,ps进程应该标准输出重定向到

2021-05-10 20:34:54 304

原创 Linux为自主实现的minishell添加重定向的功能(>> / >)

重定向符号>> :追加重定向(在文件原有内容后追加新添加的内容)>:清空重定向(清空文件原有内容,添加新内容)ls -a >> test.txt捕捉用户键盘输入1.1 解析重定向(判断有没有 > 符号)1.2 将重定向符号之前的信息按照以前的命令处理方式进行处理1.3 取出重定向的文件名称解析输入(得到命令名称+参数)创建子进程3.1 在程序替换之前进行标准输出重定向到指定的文件(open,dup2)4.在子进程进行程序替换5.父进程进程等待#include&

2021-05-07 15:49:09 80

原创 Linux基础IO

基础IO:标准库IO接口,系统调用IO接口,文件描述符,重定向原理,文件系统,动态库与静态库的生成与使用标准库IO接口:printf,scanf,fopen,fwrite,fread,fseek,fcloseFILE* fopen(const char* path, const char* mode)path:带路径的文件名mode:r,r+,w,w+,a,a+,br:只读,若文件不存在则报错返回r+:可读可写,若文件不存在则报错返回w:只写,文件不存在则创建,若文件存在清空文件原有内容

2021-05-06 16:12:19 128

原创 Linux进程控制

进程控制:创建、退出、等待、替换创建:pid_t fork(void)—通过复制父进程创建一个子进程。(代码共享,数据独有)返回值:父进程返回值大于0(子进程pid);子进程返回0;出错返回-1写时拷贝技术:创建子进程后,子进程复制了父进程,因此父子进程一开始映射的是同一块物理内存,但是当内存数据要发生改变的时候,则重新为子进程开辟空间,拷贝数据过去。—创建子进程效率高pid_t vfork(void)—创建一个子进程并阻塞父进程。(父子进程共用虚拟地址空间)父子进程共用栈区,如果同时运行就

2021-04-28 11:38:16 127

原创 Linux自主实现简单的minishell

捕捉用户键盘输入 [ls -a -l]—char* gets(char* s)解析输入信息,得到命令名称,运行参数 [ls] [-a] [-l]创建子进程,给子进程通过命令名称进行程序替换(让子进程运行命令)进程等待,等待子进程退出,防止出现僵尸进程循环以上进程什么是内建命令?在shell内部本身实现的功能,并非外部程序。并且内建功能,不需要创建子进程替换。 1 #include<stdio.h> 2 #include<stdlib.h> ..

2021-04-28 11:38:09 117

原创 Linux进程概念

Linux系统编程阶段:使用Linux系统提供的接口完成指定功能程序的编写进程概念:冯诺依曼体系结构,操作系统,进程概念,进程状态,环境变量,程序地址空间冯诺依曼体系:现代计算机的硬件体系结构(规定了现代计算机应该具有哪些硬件单元)硬件单元:输入设备-键盘,输出设备-显示器,存储器-内存条(内存-内存条,外存-硬盘),运算器,控制器(运算器+控制器=中央处理器cpu;主频:2.5GHz–每秒钟cpu能够处理多少指令)所有设备都是围绕存储器工作的,存储器是作为中间的数据缓冲而存在的硬件结构决定了

2021-04-27 16:27:59 254

原创 数据结构——堆的实现

typedef int HDataType;typedef struct heap { HDataType* _data; int _size; int _capacity;}heap;void Swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}void heapInit(heap* hp){ if (hp == NULL) return; hp->_data = NULL; hp->_size

2021-04-23 17:02:49 52

原创 数据结构——栈的实现

typedef int STDataType;typedef struct stack { STDataType* _data; int _size; int _capacity;}stack;void initstack(stack* st){ if (st == NULL) return; st->_data = NULL; st->_size = st->_capacity = 0;}void checkCapacity(stack* st){

2021-04-23 16:56:45 37

原创 数据结构——队列的实现

#include<stdio.h>#include<stdlib.h>typedef int QDataType;typedef struct QNode{ QDataType _data; struct QNode* next;}QNode;typedef struct Queue{ QNode* _head; QNode* _tail; int _size;}Queue;void initQueue(Queue* q){ if (q ==

2021-04-23 16:54:00 39

原创 数据结构——单链表增删查改的实现

#include<stdio.h>#include<stdlib.h>typedef int SLTDateType;typedef struct SListNode{ SLTDateType data; SListNode* next;}SListNode;// 动态申请一个节点SListNode* BuySListNode(SLTDateType x){ SListNode* node = (SListNode*)malloc(sizeof(SListN

2021-04-23 16:46:03 88

原创 数据结构——顺序表的实现

#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int SLDateType;typedef struct SeqList{ SLDateType* a; size_t size; size_t capacity;}SeqList;void SeqListInit(SeqList* ps){ assert(ps); ps->a = NULL; ps->c

2021-04-23 16:42:57 40

原创 Linux小程序——进度条的实现

1 #include<stdio.h> //printf 2 #include<unistd.h> //usleep 3 4 int main() 5 { 6 char buf[21] = {0}; 7 for(int i = 0; i < 20; i++) 8 { 9 buf[i] = '-'; //buf中的-不断增多 10 printf("%s\r", buf);// \r是回车符---光标移动到起始位置..

2021-04-19 15:22:15 91

原创 Linux常用工具2(gdb、makefile、git)

gdb:调试器调试器的功能:调试,观察程序的运行过程,通常目的都是为了排查程序的运行错误。程序的错误分类:编译错误,链接错误,运行时错误(运行中逻辑不对以及程序运行时崩溃)调试程序的前提:程序必须是一个debug版本的程序;gcc/g++默认生成release版本程序,若要生成debug版本,则使用- g 选项可执行程序的分类:debug调试版—加入程序调试信息,并且不会对代码进行优化;release发布版—不包含调试信息,并且会对代码进行优化。gdb常用调试指令:流程控制:run:直接运..

2021-04-19 11:28:59 147

原创 Linux常用工具1(yum、vim、gcc/g++、库的链接)

常用工具:软件包管理工具;编辑器;编译器;调试器;项目构建工具;项目管理工具软件包管理工具:yum—类似手机上的应用商店(管理当前系统中能够安装的工具以及可卸载的工具,并且实现安装以及卸载操作)查看所能安装的软件工具:yum list 查看所有工具;yum search [keyword]根据关键字查找指定的工具安装一个指定的软件工具:yum install package_name卸载已经安装的软件工具:yum remove package_name...

2021-04-16 10:45:59 135

原创 Linux基础指令2(匹配查找、shell、用户权限、文件权限等)

匹配查找指令:grep 在指定的文件中匹配包含指定字符串的行-n 显示匹配到的包含指定字符串的行在文件中的行号 grep -n ’root‘ passwd-v 匹配不包含指定字符串的行 grep -n -v ’nologin‘ passwd-i 忽略大小写进行匹配-R 在指定目录中对所有文件逐个进行字符串的匹配 grep -R ’login‘ ./find 在指定的目录中查找符合制定规则的文件-name 通过文件名查找文件 find ./ -name ‘passwd’-size +/-[..

2021-04-15 16:36:56 165

原创 Linux基础指令1(查看目录内容、显示当前路径、创建删除目录文件、拷贝剪切、改变工作路径、创建文件、显示文件内容、管道符、打包压缩等)

ls:列出当前目录下的内容(目录就是我们常说的文件夹)当前目录:当我们打开一个终端,默认就会处于一个目录中,这个目录就是当前登录用户的家目录,操作自己的文件。

2021-04-14 15:55:42 422

原创 特殊类设计

//只能在堆上创建对象的类// 1. 构造函数私有// 2. 提供一个静态的堆上创建对象的方法// 3. 防拷贝(拷贝构造声明为私有,且不实现, 或者声明为delete函数)class HeapOnly{public: static HeapOnly* getInstance() { return new HeapOnly; }private: HeapOnly() {} HeapOnly(const HeapOnly& ho) = delete;};//只能在

2020-08-10 11:49:05 426

原创 位图的实现、布隆过滤器的模拟实现

位图class BitMap{public: BitMap(size_t range) { _bit.resize(range / 32 + 1); } //查询:Test bool Test(size_t n) { //整数位置 int idx = n / 32; int bitIdx = n % 32; //获取对应bit位的二进制值 if ((_bit[idx] >> bitIdx) & 1) return true; else

2020-07-29 09:01:33 107

原创 哈希表开散列哈希桶实现,unordered_map和unordered_set的模拟实现

template<class K>struct keyOfValue{ const K& operator()(const K& key) { return key; }};template<class V>struct HashNode{ V _value; HashNode<V>* _next; HashNode(const V& _val = V()) :_value(val) ,_next(nullp

2020-07-27 19:46:03 118

原创 红黑树模拟实现

enum Color{RED,BLACK};template<class T>struct RBTreeNode{ RBTreeNode(const T& data = T(), Color color = RED) :_pLeft(nullptr) ,_pRight(nullptr) ,_pParent(nullptr) ,_data(data) ,_color(color) {} RBTreeNode* _pLeft; RBTreeNode* _pR

2020-07-20 17:17:17 106

原创 AVL树简单实现以及验证-插入

template<class T>struct AVLTreeNode{ AVLTreeNode(const T& data = T()) : _pLeft(nullptr) , _pRight(nullptr) , _pParent(nullptr) , _data(data) , _bf(0) {} AVLTreeNode<T>* _pLeft; AVLTreeNode<T>* _pRight; AVLTreeNode&lt

2020-07-18 11:55:14 207

原创 容器适配器stack、queue和priority_queue模拟实现

stacknamespace bit{#include<deque> template<class T, class Con = deque<T>> class stack { public: stack() {} void push(const T& x) { _c.push_back(x); } void pop() { _c.pop_back(); } T& top() { re

2020-07-07 19:50:12 639

原创 模拟实现双向带头循环链表list

namespace bite{ // List的节点类 template<class T> struct ListNode { ListNode(const T& val = T()); ListNode<T>* _pPre; ListNode<T>* _pNext; T _val; }; //List的迭代器类 template<class T, class Ref, class Ptr> class ListIte

2020-07-07 09:06:01 155

空空如也

空空如也

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

TA关注的人

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