自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小Z的博客

一位成长中的小白!

  • 博客(108)
  • 收藏
  • 关注

原创 Go Package

Go Packagepackage 基本使用(1)目中的每个文件夹都是一个package。package下可以嵌套package。但每个.go文件的package以其所在的当前文件夹为准。(2)在GoLand中新建文件夹时,在该层目录下新建的.go文件,其package默认为当前文件夹名大小写一致。当.go文件创建后,再去修改文件夹名时,需要注意其下的.go文件中的package是否自动修改。(3)同一层目录下的.go文件,package必须一致,否则编译出错package 可见性在go语言中

2020-05-20 20:59:21 659

原创 搜索引擎项目

搜索引擎项目一. 项目介绍1. 基本思路:模拟百度搜索的方式实现站内搜索引擎,整个项目分为两大部分,HTTP服务器和搜索服务器:HTTP服务器的功能就是接受用户数据,显示索引结果搜索服务器分为客户端和服务器端,客户端来负责提取有用的信息,服务器端来进行检索2. 模块划分整体分为4个模块:HTTP服务器搜索客户端(CGI程序)搜索服务器(RPC框架)索引...

2018-08-22 22:43:34 3444

原创 基于CGI协议的HTTP服务器项目

HTTP服务器

2018-08-19 12:13:40 3916 3

原创 Linux下的stat函数

stat 函数函数原型 #include <sys/stat.h>int stat(const char *file_name, struct stat *buf);函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值: 执行成功则返回0,失败返回-1,错误代码存于errnostruc...

2018-08-17 19:45:01 655

原创 网页搜索引擎中的核心索引结构 - 利用 Google Protobuf 构建

索引结构 — Index利用 Google Protobuf 构建索引结构 —– Index在搜索引擎中,常见的索引方法就是正排索引和倒排索引,因此我们 Index 索引结构要包括两两个方面:正排索引 — ( forward_index )倒排索引 — ( inverted_index )正排索引正排索引是根据文件的id号,得到所有的文件信息,因此正排索引中存放的是...

2018-08-15 15:31:49 659

原创 继承体系中的同名隐藏

在继承体系中,如果派生类中含有一个与基类同名的成员,那么基类的同名成员将会被派生类的同名成员所覆盖(即隐藏),想要访问基类的同名成员就必须明确指定出基类的作用域。那么,为什么是派生类的同成员覆盖基类的同名成员,而不是基类的同名成员覆盖派生类的同名成员?作用域当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。即派生类的作用域位于基类作用域之内。也是由于这样派生类才能像...

2018-08-15 08:58:23 366

原创 Python中一些简单常用的处理文件方法

改变文档的编码import sysreload(sys)sys.setdefaultencoding('utf-8')加上上面的三行之后就可以正常的显示或使用中文。os.walk( top ) os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目...

2018-08-14 19:08:06 262

原创 exec进程替换

exec进程替换,替换的其实是进程的代码段,数据段,堆栈段。几种函数的使用情况: char* const argv[] = {"ls","-al", NULL}; char* const envp[] = {"PATH=/bin:/usr/bin","TERM=console",NULL}; // + l(list) 1.路径是绝对路径 // ...

2018-08-11 08:24:01 387

原创 Google protobuf 用于数据的存储/序列化/反序列化

protobuf介绍谷歌开源的Protocol Buffer,简称protobuf,是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,且不受平台和语言的限制。简单来说,如果你需要存储数据,且这些数据为多个程序所共享,涉及数据的传输与接收问题,需要数据的序列化与反序列化,那么protobuf就非常适合你了。它不但可以帮你完成数据的存储,数据传输时的序列化和反序列化,并且适用于不同...

2018-08-06 17:53:38 4119

原创 glog库

glogglog是google开源的程序级日志库,我们同样也可以用在我们的项目上面,来作为程序的日志监控。glog库,使用起来非常方便,且功能同样非常强大。日志的级别有四种:INFO(正常) ,WARNING(警告),ERROR(错误),FATAL(致命)日志会存放在你自定义的路径下使用过程的介绍整个使用过程分为三步,第一步初始化,第二步选择存放日志的路径,之后在要使用...

2018-08-06 14:29:28 1040

原创 gflags 命令行参数配置库

gflag介绍google开源的gflags是一套命令行参数解析工具主要就是用来解析命令行参数,并且支持从文件或者从环境变量中读入参数,功能十分强大gflag的使用我们以使用为目标进行讲解,不会进行深入了解(其实并不是很难,有兴趣的朋友可以多去了解一下),仅仅让你知道gflags可以怎么快速的,直接使用起来。至于gflags的安装也不进行过多的介绍,可以自行搜索。头文...

2018-08-06 11:49:40 1661

原创 64位 Linux操作系统下的类型大小

64位 Linux操作系统下的类型大小测试代码#include <iostream>using namespace std;int main(){ char _char = 'a'; short _short = 1; int _int = 1; float _float = 1.7; double _double = 3.4; long _...

2018-08-06 10:38:03 843

原创 函数栈帧

函数的调用过程是在栈上完成的,由有操作系统开辟栈空间。主要用到三个寄存器: EIP 用来存放函数地址 EBP:栈底寄存器 ESP:栈定寄存器函数调用的过程:如:main函数调用fun的过程:int fun(int a, int b){ return a + b;}int main(){ int a = 1; int b = 2; ...

2018-08-03 17:51:45 290

原创 TCP协议

TCP全称为“传输控制协议”,传输层协议,TCP是一种有链接的,传输速率慢,可靠性高的协议TCP协议段格式16位的源端口号: 发送方的端口号16位的目的端口号:接收方的端口号32位的序列号: 本次发送数据段的序列号32位的确认序列号:向对端表明自己接下来想要收到的序列号,且表明该确认序列号以前的数据段都无误接收到了4位首部长度,指最多有15(1111)个32位的比特位(...

2018-07-29 17:19:25 256

原创 空类

#include <iostream>using namespace std;class a{};int main(){ a _a; cout << sizeof(_a) << endl; return 0;}空类,没有任何成员变量和成员函数,没有存储任何数据但是空类仍可以实例化对象,编译器就需给它分配内存空间...

2018-07-28 11:01:02 262

原创 为什么C++支持重载而C语言不支持重载

一个函数在C++中能够被重载,但是在C语言确不能被重载的,是由于函数名在内存中存储方式不同所导致的。C语言例如在C语言中,有以下三个函数,只给声明不给定义!int fun(int a, int b);int fun2(int a, char b);char fun3(char a, char b);在main函数中调用之int main(){ fun(...

2018-07-28 10:45:36 3371 2

原创 利用Huffman树实现文件压缩

项目名称利用Huffman树实现文件压缩项目概要使用的编辑语言是C++,项目目的是能够实现对文件的压缩及解压,涉及到的技术主要有huffman树的实现,文件的IO操作,优先级队列等;huffman算法原理: Huffman算法是一种无损压缩算法,Huffman需要得到每种字符出现概率,通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占的位数...

2018-07-20 15:09:23 434

原创 Linux创建子进程- fork()和vfork()

forkfork()是Linux中在一个进程中创建一个子进程的系统调用。函数原型#include <unistd.h>pid_t fork(void);进程创建的一般过程1.给新进程分配一个标识符,在内核中分配一个PCB2.复制父进程的环境(不复制地址空间)3.分配资源(程序,数据,堆栈等)4.复制父进程的地址空间的内容5.将进程置成...

2018-07-16 10:50:38 994 1

原创 main函数的return

最近的一段时间在return这个关键字进行了一点的探究,主要是涉及到调用return之后函数会进行什么操作。return是一个关键字,调用return会进行函数的返回,将后面的参数返回给调用者(main函数也是被调用的),并销毁调用堆栈。以上是return函数的作用,接下来主要看一下main函数的return之后会发什么。测试代码如下:int main(){ return...

2018-07-16 10:14:35 10814

原创 进程间通信-信号量集

通用代码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>union _semun{ int val;};int...

2018-06-25 12:48:09 207

原创 Linux共享内存-进程间通信

linux中进程间通信的方法有不少,一般的进程间通信是通过linux内核来完成的,每次信息的交流都先传递给内核,由内核在转给另外一个进程。因此在执行过程中,不断的由用户态到内核态,再由内核态到用户态,消耗的资源非常大。因此共享内存的出现大大的解决了这个问题,共享内存的实现仅仅在开始从内核中申请一段内存,借助这块内存,之后全部都是在用户态下完成的,由于不再由资源转换方面的浪费,使得进程间通信的速...

2018-06-11 11:36:49 177

原创 Linux网络编程 tcp套接字代码

本次介绍一下TCP协议下的套接字代码,总体来看,tcp协议比udp协议更加安全可靠,无论是从用户使用的角度还是从编写代码的角度,你会发现与udp不同的是tcp在每次通信前,服务器端和客户端都会进行一次连接,连接成功后,才可以进行相互间的通信。套接字APITCP套接字的API主要有以下几个://建立套接字int socket(int domain, int type, int pr...

2018-06-07 15:10:34 363

原创 Linux网络编程 udp套接字代码

udp部分的网络编程,主要分为3个部分,套接字的创建,端口号和ip地址的绑定,数据的读取和发送,我们一般创建两个文件,分别用来建立服务器和客户端。UDP服务器代码服务器的编写可以分为:udp套接字的创建,绑定端口号和ip地址,等待接受数据并处理。这里我们简单的做一个回显服务器,就是服务器接收到客户端发来的数据后不进行什么处理,直接将原数据返回给客户端。udp套接字创建说到网络编...

2018-06-06 17:48:35 749

原创 Linux消息队列

Linux中的消息队列是进程间通信的一种方式,通过创建一个消息队列可以完成一个或者多个进程的信息交汇。因此,首先我们要了解消息队列是什么。消息队列的定义消息队列的本质其实是一个内核提供的链表,内核基于这个链表,实现了一个数据结构,并且通过维护这个数据结构来维护这个消息队列。向消息队列中写数据,实际上是向这个数据结构中插入一个新结点;从消息队列汇总读数据,实际上是从这个数据结构中删除一个结点...

2018-06-02 11:59:24 3053 1

原创 Linux管道

在Linux中,管道是一个比较重要的概念,进程间通信的一种方法,管道分为两种,一种是匿名管道,一种是命名管道。匿名管道匿名管道的本质是内核中提供的的一段内存。匿名管道的的特性:用于有亲缘关系的进程半双工,单项通信,双向通信需要两个管道声明周期随进程有内置的同步互斥机制面向字节流匿名管道的创建非常简单,首先需要定义一个存放两个整形变量的数组:int df[2],用...

2018-06-01 21:46:08 1767

原创 深入探究C++虚拟继承

C++的继承作为它的一个特性,必须要做到深入了解,对于C++继承方式,我们之前讲过,有单继承,多继承,菱形继承,虚拟继承,菱形虚拟继承。这次我们来深入探究一下虚拟继承和菱形虚拟继承。不过在此之前,先让我们简单的了解一下他们的作用。在不考虑含有虚拟继承的情况下,C++继承模型中大多数情况下是菱形继承,虽然菱形继承是一个很有用的继承方式,但是它存在一个问题,就是访问二义性的问题,而这时我们引入...

2018-05-23 10:45:02 497 1

原创 C++继承

C++的三大特性:封装,继承,多态。在了解类与对象之后,我们来了解一下什么是继承。1.继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有的特性基础上进行扩展,增强功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承格式 2.继承的作用继承有效的使代码得到复用,同时继承服务于多态,动态...

2018-05-19 11:06:06 286

原创 string类的深拷贝和浅拷贝

1.string的浅拷贝如果一个string只显示的给出构造函数和析构函数,拷贝构造函数和赋值运算符重载使用系统默认的,当进行拷贝和赋值时,会出现什么结果:#include <string.h>class String{public: String(const char* str = ""); ~String();private: char*...

2018-05-07 10:31:59 14812 1

原创 C++动态内存管理

1.C语言动态内存管理在C语言中,我们主要对内存的动态管理主要使用的是malloc和free两个C标准库函数,所以我们主要来介绍一下malloc/freemallocmalloc函数原型void* __cdecl malloc(size_t _Size);malloc 不保证成功 要检测returnmalloc首先会扫描之前由free()所释放的空闲内存块列表,以求找到尺寸大...

2018-05-04 16:12:02 227

原创 Git笔记

之前一直有听说github,一个被称为程序员的交友网站,我作为一个程序猿,不去浏览一下是不可能的,进去的第一个感受——哇!全英文!(原谅我英语水平真的有限)在浏览了一段时间后,也对github有了一定的了解: 一个面向开源及私有软件项目的托管平台,只支持git 作为唯一的版本库格式进行托管。想到我一直需要一个管理和储存并可以分享代码的地方,github真是太合适了,立马就想要创建...

2018-04-27 14:02:59 144

原创 简单的日期类实现

主要功能:求当前日期第days天后是哪一天? 求当前日期第days天前是哪一天?求两个日期之间的差值前置++ 和 后置++ 前置– 和 后置–其他运算符重载 代码实现:date.h文件#pragma once#include <iostream>using namespace std;class Date{public: Date...

2018-04-16 13:28:50 219

原创 C++类和对象知识点总结

C++中几个重要知识点: 引用 this指针 构造函数 析构函数 运算符重载 友元函数 C++类和对象知识点总结1.函数重载的条件:a. 同一作用域b. 参数名相同c. 形参列表(参数个数,类型,顺序)不同 2.函数调用约定 a. _cdeclb. _stdcallc. _thiscall3.引用...

2018-04-13 17:29:42 2848

转载 C/C++ 函数调用约定

函数调用约定 常见的函数调用约定[5]:cdecl,stdcall,fastcall,thiscall,naked call MFC调用约定(VS6:Project Settings->C/C++ Calling convention:)1.__cdecl(C调用约定.The C default calling convention)C/C++ 缺省调用方式压栈顺序...

2018-04-13 14:42:46 280

原创 获取一个函数的执行时间

我这里采用的是Time.h头文件中的clock_t clock()函数, 该函数返回的是从程序开始运行到调用clock函数时所打的点数,即clock tick(时钟打点);常数CLK_TCK,是机器时钟每秒所走的时钟打点数;用函数运行时所记录的打点数除以CLK_TCK就可以得到运行时间实例如下:#include <iostream>#include <cti...

2018-04-13 14:10:35 945

原创 Linux-system函数

函数原型:#include <stdlib.h>int system(const char *command);函数介绍: system()执行通过调用/bin/sh -c命令指定的命令,并在命令完成后返回。在执行com-的过程中,命令SIGCHLD将被阻塞,SIGINT和SIGQUIT将被忽略。...

2018-04-11 16:42:47 129

原创 Popen()函数

函数原型: #include <stdio.h> FILE *popen(const char *command, const char *type);popen介绍:popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。 用法://...

2018-04-11 16:37:39 741

原创 封装fork/wait等操作, 编写函数 process_create()

封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数. 代码#include <stdio.h>#include <unistd.h>#include <sys/wait.h&g...

2018-04-06 18:17:23 230

原创 在Linux下实现自己的shell

代码#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h> char *argv[8]; int argc = 0; void do_shell() { pid_t pid; if((pid = fork()) ...

2018-04-06 16:40:28 686

原创 linux模式实现孤儿进程

孤儿进程 父进程如果提前退出,那么子进程就称之为“孤儿进程” 孤儿进程被1 号进程收养 模拟实现孤儿进程//模拟实现孤儿进程 #include <stdio.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if( ...

2018-04-06 15:27:45 400

原创 Linux模拟实现僵尸进程

Z(zombie)-僵尸进程 僵死状态(Zombies) 是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码是就会产生僵尸进程。 僵尸进程会以终止状态保存在进程表中,并且会一直等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在执行,但父进程没有读取子进程状态,子进程进入Z状态 模拟实现僵尸进程 代码//模拟实现僵尸进程...

2018-04-06 14:51:30 1665

空空如也

空空如也

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

TA关注的人

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