自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 apache2配置重启失败,AH01630和AH00169

本来的目的是更换apache2中PHP的默认执行目录,进行如下操作:cd /etc/apache2/sites-availablesudo vim 000-default.conf<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is

2020-07-22 11:26:03 901 1

原创 FTP搭建过程,Linux与Windows文件的文件传输解决方案

记一次搭建FTP的流程服务器搭建:服务器使用vsftpd,在Linux平台下,ubuntu16.04。安装过程:sudo apt-get install vsftpd启动vsftpd服务:service vsftpd start为vsftp建立文件目录:sudo mkdir /home/uftp新建用户uftp,指定用户主目录和所用shell,并设置密码。sudo useradd -d /home/uftp -s /bin/bash uftp将目录/home/uftp的所属者和

2020-07-21 17:47:05 361

原创 异步日志组件的实现

当我们的程序运行到线上,或者说它处于一个我们无法调试,或者不方便调试的状态下,日志有助于我们查看当前程序的运行状态,帮我们排除故障。也可以帮我们记录服务器运行的记录,从而可以还原一些处理过的关键信息,可以帮助我们避免一些无法查证的事情。但是同步日志有可能在性能方面,无法满足服务器的要求,故而考虑设计异步日志组件。这个日志组件并非是我独立思考设计,其中参考了很多前辈的思想和经验。在这写下一些总结...

2020-04-09 20:47:04 440

原创 本地仓库关联已经有的远端git仓库

网上教程关联远端仓库都杂七杂八的,说什么的都有,但是多多少少都有一些坑需要填,这里写一些自己用的比较方便的东西。这个东西需要一下几点情况可以适用:本地已经安装过git远程仓库已经建立过了然后你要做的就是,创建一个密钥:ssh-keygen -t rsa -C"example@mail.com"然后一路回车,本地就会创建一份密钥出来。这个东西在你本地用户的.ssh目录下:cd ...

2020-04-01 12:53:27 410

原创 lamp环境轻松搞定

wget http://mirrors.linuxeye.com/lnmp-full.tar.gz tar xzf lnmp-full.tar.gz cd lnmp一把梭就装好了~

2020-03-01 23:46:23 151

原创 Redis源码剖析之简单动态字符串

Redis是一个开源的key-value存储系统,现代软件的很多场景都需要使用这种类似的内存数据库,因此对Redis的深入了解是非常有必要的。本篇文章主要是通过阅读黄健宏老师的《Redis设计与实现》来记录自己的学习进度和加以总结。这是一份在github中开源的带有注释的Redis中简单动态字符串头文件源码,希望阅读的朋友可以点开看。Redis中,C字符串只会最为字符串字面量用在一些无需对字...

2019-12-26 15:36:02 177

原创 Git冲突:commit your changes or stash them before you can merge.

有时候,git pull代码的时候会发生冲突。通常有这么几种情况:你改了代码,没提交,冲突了服务器更新了代码,和本地的冲突了你改了,服务器也改了,冲突了那如何解决呢?git提供了这样一种方案git stashgit pullgit stash popgit stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的...

2019-10-30 10:01:53 129

原创 C++11的模板,VariadicTemplate

C++11的模板基于之前有了很大的特性增强,今天我们介绍一些关于与它的特性,也是我在学习这些部分的一些总结。void print(){}template <typename T, typename...Types>void print(const T&firstArg, const Types&... args){ cout << siz...

2019-09-03 23:26:24 362

原创 查找重复的行(Go语言)

我们在处理文件的时候,很多时候会需要解决文件拷贝、文件打印、文件搜索、文件排序、文件统计类这一类问题,这类程序通常会有比较相似的结构,一个处理输入的循环,在每一个输入元素上执行计算处理,在处理的同时或者处理完成之后进行结果输出。首先我们来书写一个dup输出标准输入流中的出现多次的行,在行内容前是出现计数的次数。package mainimport( "fmt" "os" "bufio...

2019-05-05 21:30:24 604

原创 Go入门

从今天开始用博客记录学Go语言的过程,为什么要学Go语言呢?网上已经有很多资料表明Go语言的优势。所以在这里Go语言的优势便不再一一表明,编程界的高富帅,语法简单,编译速度快,自带gc(垃圾回收),出身名门,等等。Go语言的安装环境这里不再赘述,直接开始进入程序部分。package mainimport "fmt"func main(){ fmt.Println("Hello, w...

2019-04-16 23:22:55 159

原创 在ubuntu16.04版本下安装boost库

1.下载安装包1_55_0,解压wget -O boost_1_69_0.tar.gz http://sourceforge.net/projects/boost/files/boost/1.69.0/boost_1_69_0.tar.gz/downloadtar xzvf boost_1_69_0.tar.gzcd 到boost_1_69_0目录下ps:安装包也可以去网上下载2.安装附...

2019-02-20 20:45:47 4897

原创 友元函数和运算符重载

友元函数友元函数是C++中的一种机制,它不属于类的成员函数,但是可以访问到类的私有变量,因此,它在一定程度上破坏了封装的特性。class T{public: T(int a, int b): _a(a), _b(b) { } firend void Change(T&amp; , int);private: in...

2018-10-30 21:06:48 1131

原创 C++中的const

C++中的const继承于C中的关键字const,但是在底层实现上已经有了本质的区别。在C语言中,被const修饰过的关键字只能称之为常变量,或者说是一个只读的变量,它本身仍然可以通过一些手段来进行修改,如指针。下面是一段C的代码:#include &amp;lt;stdio.h&amp;gt; ...

2018-10-29 12:35:50 217 6

原创 五种IO模型

所有的I/O都分为两步完成,第一步是等待事件的发生,第二步是将数据进行拷贝。一个高效的I/O模型就是尽量减少等待在整个I/O模型中所占的比重。阻塞I/O在内核将数据准备好之前, 系统调⽤用会⼀一直等待. 所有的套接字, 默认都是阻塞⽅方式。 非阻塞I/O如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回WOULDBLOCK错误码。非阻塞IO往往需要程序员循环的方式...

2018-07-30 20:22:24 247

原创 TCP协议与UDP协议

TCP协议,全称传输控制协议,处在传输层之中,下层为网络层,上层为应用层。UNP协议,全称用户数据报协议,所处位置与TCP相同。而谈到传输层,则必须谈到端口号,端口号的名称可能没有IP地址那么响亮,但是它仍然非常重要,在TCP/IP协议中,用“源IP”,“源端口号”,“目的IP”,“目的端口号”,“协议号”这样一个五元组来标识一个通信。端口号的范围划分:0-1023:知名端口号,...

2018-07-27 17:10:32 970 1

原创 客户/服务器模型

在我们日常所见的网络应用程序中,很多都是由客户/服务器(C/S)模型组成的。服务器主要承担着提供资源的责任,通常可以为数量较多的客户提供服务。今天我们主要来通过一个最基本的回射服务器和客户端模型的编写,来体会到客户和服务器的角色定位,以及对套接字有更深的理解。首先要有一些准备知识,了解在Linux下的网络编程的套接字接口。socket函数 功能:创建一个套接字用于进程通信。套接字...

2018-07-25 15:03:10 3755

原创 Linux下的网络套接字

网络套接字又叫socket套接字,在不同的条件下谈的socket可能会代表不同的含义。我这里主要谈的是用来进行不同主机中的进程间通信的套接字。套接字由两部分组成socket:[IP地址+端口号]。IP地址是在互联网中用来唯一标识一台主机的地址,端口号是在一台主机中用来唯一标识一个进程的。但是在前面的文章中有提到过,Linux或其他操作系统中,,进程ID用来唯一标识一个进程,那么端口号与...

2018-07-24 17:09:12 793

原创 C++中的动态内存管理(new和malloc)

在C语言中,用malloc/calloc/realloc/free来进行动态内存管理。这三者都是在堆上对空间进行开辟,free将申请到的空间释放掉。malloc只有一个参数,就是需要申请空间的大小,成功返回所开辟空间的指针,失败返回NULL。void* malloc(size_t size);calloc有两个参数,第一个参数num表示开辟多少个空间,第二个参数size表示每个...

2018-07-23 15:04:36 1702

原创 详解HTTP协议

当我们在浏览器中输入URL(统一资源定位符),浏览器会给我们呈现出想要访问的页面。在这背后工作的协议就是HTTP。URL(Uniform Resource Locator)是使用Web浏览器等访问Web页面时需要输入的网页地址。我们日常生活中经常会使用到一些搜索引擎,如百度,必应等。如果在搜索框中输入/?:这样的字符,已经被url当做特殊意义理解了。因此这些字符在url中是不能随意出现...

2018-07-16 12:02:02 567

原创 进程间关系和守护进程

在操作系统中,进程具有独立性!但除了进程,操作系统还通过别的方式进行管理。前面提到了一个很重要的思想,管理。一些系统中需要进行管理的进程,文件,目录等等,都可以抽象为,先描述,再组织。通过这样的方式来进行管理!就像为了提高并发性,引入了线程的概念。为了更好的管理进程,Linux下还引入了一个概念,叫做进程组。每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的...

2018-07-09 16:33:38 150

原创 C++中的构造函数,拷贝构造和析构函数

在我们用类实例化对象的时候,通常都会在类的默认成员函数中调用一个叫做构造函数的东西。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只调用一次,保证每个数据成员都有一个合适的初始值。class Date{public: Date(int year = 1900, int month = 1, int day = 1) {...

2018-06-30 23:14:14 231

原创 C++中的类

在C语言中,我们都知道,变量(数据)和函数(处理数据的操作)很少存在直接的关联,我们一般也不会将它当做一个整体去看待,并且C语言本身也并不支持我们这样去做。所以的数据由一组“分布在各个以功能为导向的函数中”的算法所驱动,它们处理的是共同的外部数据。就算是结构体,也仅仅只能抽象描述一个事物所具有的属性,仅此而已。但在C++中,结构体不仅仅可以定义变量,也可以定义函数。这样做有什么好处呢?在我...

2018-06-27 09:17:44 288

原创 Linux下的线程

在程序里,一个执行线路,或者说一个执行流就叫做线程。一个线程是“一个进程内部的控制序列”。一个进程至少有一个线程。线程是比进程更轻量级的概念。类比进程的管理方式,进程有进程控制块(PCB),用PCB管理进程。那么线程也应该有线程控制块(TCB),用这样的数据结构来管理线程。事实上在有些操作系统下也的确是这样做的,比如Windows。但Linux作为一款非常优秀的操作系统,做出了与其它操作系...

2018-06-24 22:51:25 158

原创 Linux下的信号

信号是操作系统发给进程的一种信息,进程会针对接收到的信息做出相应的处理。前面谈到一个概念,叫做信号量,这里所说的信号量和我们今天谈到的信号,除了名字相似,事实上并没有任何联系,是两个完全不相关的概念,故不可混为一谈。信号是如何产生的呢?先来说说熟悉的场景:用户输入命令,在前台启动一个进程,然后按下Ctri+C这个组合键,键盘产生一个硬件中断,终端驱动将Ctrl+C解释成一个SIGINT...

2018-06-21 12:54:40 167

原创 C++中的引用

在C语言中,传参有两种方式,传值和传址。传值:在函数调用过程中会生成一份临时变量,最终把实参的值传递给新分配的临时变量,如果想要得到函数的计算结果则需要返回值。优点:避免了函数调用的副作用。 缺点:无法改变形参的值。传址:通过传地址的方式,然后将地址的临时变量传递给函数,通过对地址解引用可以找到原本的形参。指针的确解决了问题,但是指针比较复杂,影响代码的可读性,而且不太安全,容易...

2018-06-18 21:40:08 171

原创 C++中的函数重载

函数重载在很多语言中都存在,那么什么是函数重载呢?为什么要有函数重载?带着这个问题,我们来进行一次思考…首先从很多书本上都可以看到函数重载的概念:函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了命名污染,对程序可读性有很大的提示,也间接降低了维护的成本。我们来一段代码体会一下函数重...

2018-06-18 15:48:31 234

原创 信号量集

信号量的最主要的目的是被用来进行同步和互斥的。同步和互斥这两个概念在我进程间通信的时候解释过,记不起来的小伙伴可以点这里。在这里,解释一下信号量为什么能达到互斥的效果,以及信号量的本质。信号量本质上来说,就是一个计数器,其本身除了标志资源是否存在没有其他意义。为什么这么讲呢?举个栗子:你有100亿人民币,想象一下就是这么膨胀!那么正常人都不会把这100亿的钞票带在身上吧,我们的...

2018-06-17 18:10:14 1227 1

原创 共享内存

共享内存的本质是让两个进程能够看到一块内存区域,共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,也就是说,进程不再通过执行进入内核的系统调用来传递彼此的数据。获取共享内存的方式和消息队列类似,下面来介绍一下。shmget函数:用来创建共享内存。int shmget(key_t key, size_t size, int sh...

2018-06-17 17:16:47 235

原创 消息队列

消息队列基本概念:消息队列提供了从一个进程向另一个进程发送一块数据的方法。每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同类型值。 消息队列和管道有很多相似,也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限。如何使用消息队列因为消息队列是内置的的通信方式,所以...

2018-06-14 15:56:46 243

原创 Linux下的匿名管道与命名管道

管道是Unix中最古老的进程间通信的形式。既然是通信,那么也逃不脱通信的共有的特点那就是中间的进程之间的公共部分。在管道通信中,管道就充当这个公共的部分。管道分两种,一种是匿名管道,一种是命名管道。匿名管道在命令行下输入的|都是匿名管道。那么除去指令,如何在程序中创建一个匿名管道呢?#include&lt;unistd.h&gt;int pipe(int fd[2]...

2018-06-13 13:19:02 495

原创 进程间的通信

前面在聊到进程的概念的时候,我们知道,进程在操作系统中是一个个相互独立的个体,也就是说,在没有外力介入的条件下,进程之间相互独立,是无法相互看见对方的。 在前面聊到动态库的时候,我们提过一句虚拟内存的机制。(想要看动态库内容的朋友点这里) 那么究竟虚拟内存是个什么情况呢?这个就是虚拟内存到物理内存转化的示意图,也就是说,我们用高级语言写出来的程序,其中指针所指向的地址,其实是虚...

2018-06-12 17:42:03 350

原创 C++中的缺省参数

在C语言中,函数没有指定参数列表,默认可以接收任意多个参数,但在C++中,因为严格的参数类型检测,没有参数列表的函数,默认为void,不接收任何参数。缺省参数:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用函数时,如果没有指定实参则采用该默认值,否者使用指定的实参。来看一段简单的代码:#include&lt;iostream&gt;using namespace s...

2018-06-11 20:52:43 10924 7

原创 Linux下的静态库和动态库

在我们平时写代码的时候,通常会引用一些库文件来帮助我们实现需要的功能,这些库文件是别人提前已经写好的,我们只需要拿出库文件的接口来使用就可以了。这种库文件分为两种,一种是静态库,一种是动态库。静态库(.a):程序在编译链接的时候把库的代码放进可执行文件中。程序运行的时候将不在需要静态库。它的后缀名是一般起名为.a文件。静态库可以简单的看成一组目标文件集合,即很多目标文件经过压缩打包后形...

2018-06-11 11:42:13 268

原创 Linux下的进程和进程间的状态转换

在我们的计算机层次结构中,操作系统是处于一个承上启下的层次。如下图~在计算机中,操作系统的定位是一个管理者,对上管理在系统中运行的进程,对下通过驱动程序管理各种硬件。说到进程,首先得稍微解释一下,什么叫做程序。程序:程序是以某种语言编写,为完成某个特定任务的一系列指令和数据的有序集被称之为程序。那么什么是进程?从用户的角度来解读,进程就是程序的一次动态的执行过程。但是想要深...

2018-06-10 22:31:36 4776

原创 希尔排序

希尔排序(Shell Sort) 希尔排序又称“缩小增量排序”。其基本思想在于先将整个待排序列分割成若干子序列,对子序列进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小),再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率很高,因此希尔排序可以说是在直接插入排序上的优化,比直接插入排序是有较大提高的。void ShellSort...

2018-06-10 18:22:57 123

原创 插入排序

插入排序: 插入排序,每一步将一个新的元素插入到前面已经排好序的一组元素的合适位置上去,直到全部元素插入为止。插入排序比较适合的场景是元素已经接近有序,这样的场景下插入排序的效率较高。 最优情况下:时间复杂度可达到O(N)。 最差情况下:时间复杂度会达到O(N^2)。 空间复杂度:O(1),并且这是一种稳定的算法。稳定:如果a,b两个元素的值相等,排序之前a在前,b在后,而排...

2018-06-09 23:36:04 294

原创 哈希表之开散列

了解哈希基本看概念请看这里:搜索结构之哈希 开散列完整代码:开散列开散列每一个地址的底层实现像一个个的桶,所以又叫哈希桶,同一个桶中存放哈希冲突的元素。通常,每个桶对应的链表结点都很少,将n个关键码通过某一个散列函数,存放到散列表中的m个桶中,那么每一个桶中链表的平均长度为n/m,以搜索平均长度为n/m的链表代替搜索长度为n的顺序表,搜索效率快的多。应用链地址法处理溢出,需要增设链接...

2018-06-04 18:31:07 225

原创 哈希表之闭散列

了解哈希的基本概念可以看这里:搜索结构之哈希闭散列代码:闭散列#pragma once#include&lt;stdio.h&gt;#include&lt;assert.h&gt;#include&lt;malloc.h&gt;#include"Comm.h"typedef int DataType;typedef enum State{ EMPTY, //当前...

2018-06-02 21:19:53 142

原创 搜索结构之哈希

哈希表是一种非常重要的数据结构,甚至可以说是查询方面最快的数据结构了! 与其他数据结构相比,哈希表不需要比较查找,而是通过某种哈希函数直接找到目标位置。向哈希表中插入元素,只需得到该元素的关键码,以此计算元素的存储位置进行存放。在哈希表中搜索仍然进行同样的计算,把求得的存储位置中的元素与需要查找的元素进行比较,如果相等则查找成功。然而天下没有免费的午餐,虽然哈希结构的搜索速度极快,但...

2018-06-02 21:15:32 280

原创 文件标识符及Linux下的文件相关调用接口

在我们运行C程序的时候,C会为我们默认打开三个输入输出流,分别是stdin,stdout,stderr。通过查阅man手册可以得知,这三个流的类型都是FILE*,fopen返回值类型是文件指针。打开文件的类型一般有r,r+,w,w+,a,a+这些读写和追加这几种对文件的操作方式。FILE *fp = fopen("filename","w");const char* msg = "h...

2018-05-20 18:29:25 444

空空如也

空空如也

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

TA关注的人

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