- 博客(82)
- 收藏
- 关注
原创 shell脚本中数组用法总结及脚本实现冒泡排序
在用shell脚本实现冒泡排序之前,我们先来总结一下shell中的数组。1.shell脚本中数组的操作(1)shell脚本中数组的定义 arr=(1 2 3 4 5 6 7 )(2)默认获取数组中第一个元素 echo $arr 或者 echo ${arr[0]}(3)通过下标访问取出数组中的元素 echo ${arr[2
2017-09-03 22:44:17
3523
3
原创 gtest之断言宏的使用以及三种事件机制
前面简单的介绍了一下gtest以及在Windows下如何安装gtest,今天再介绍一下在Linux下该如何安装。本文重点:在Linux下如何安装gtest;gtest下断言宏的介绍;gtest中的三种事件机制;对以前我们写过的list进行一个简单的测试。 1.在Linux下如何安装gtest首先我们需要下载一个软件包:这里给出链接地址https://codeload.gi
2017-08-08 00:23:43
4609
原创 单例模式(饿汉模式和懒汉模式)
单例模式也叫单件模式。Singleton是一个非常常用的设计模式,几乎所有稍微大一些的程序都会使用到它,所以构建一个线程安全并且高效的Singleton很重要。 单例模式的特点: 1>单例类保证全局只有一个唯一实例对象。 2>单例类提供获取这个唯一实例的接口。1.下面先简单设计一个单例模式 但是这样设计会有线程安全的问题。为什么说这样实现的一个单例模式是线程不安全的呢?是因为暴露给外
2017-08-04 17:08:37
1130
1
原创 求出最喜欢的前k种最喜欢的水果
近几年cvte的面试题中有这样一个问题: 本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 1.题目分析: (1)它要求统计出所有水果出现的次
2017-08-03 11:53:12
677
原创 剖析STL空间配置器
本文将围绕以下几方面逐步对STL空间配置器进行一个剖析1.为什么要有空间配置器,它是用来解决什么问题的?2.STL中标准版本带来什么问题?如何解决的?3.探索STL中的SGI版空间配置器。 (1)一级空间配置器该如何做的? (2)二级空间配置器又是怎样的一个工作流程?1.为什么要有空间配置器,它是用来解决什么问题的?相信熟悉vector的同学可能
2017-07-27 10:37:11
707
1
原创 软件测试概念总结
1.什么是软件测试?答:软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。2.软件测试目的?答;测试的目的是想以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺
2017-07-24 11:48:13
1078
原创 Goole C++ 单元测试框架(一)
在了解Goole C++单元测试框架之前,我们先来明确以下几个问题: 1.什么是单元测试? 单元测试一般由编码人员自己完成,它的目的是隔离程序部件,并证明这些单个部件满足预期的功能。在静态程序分析、代码检视之后进行单元测试,可以帮助我们在开发过程的早期发现问题。 2.好的测试具备以下特点: (1)独立,即该测试用例的测试结果不受其他测试的影响; (2)有效的组织架构,清晰的命名; (3)
2017-07-23 11:18:29
3411
原创 shell工具篇之awk
1.了解awk必须要知道的三点:awk是文本处理工具,不仅能以行为单位处理文件还能以列为单位处理文件;awk默认行分隔符为'\n' ,列分隔符默认为空格或tab;awk还是一门很复杂的脚本语言,具有类C一样的分支和循环结构。2.awk命令格式
2017-06-26 13:57:56
1121
原创 shell工具篇之sed
1.首先先来了解一下什么是sed?sed叫做流编辑器,在shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换成为另一种格式输出。下面我们通过一张原理图来了解一下它的工作模式:编辑命令的格式为,sed /pattern/action经过sed处理后文件内容并没有改变,除⾮使用重定向存储输出。Sed主要用来自动
2017-06-24 14:01:20
2815
原创 shell工具篇之grep
在介绍shell工具之前我们先来看一下有关正则表达式的概念。1.什么是正则表达式?规定一些特殊语法表示字符类、数量限定符和位置关系,然后⽤这些特殊语法和普通字符⼀起表示 一个模式,这就是正则表达式(Regular Expression)。总结一点:正则表达式三大要素(1)规定目标字符串的字符类;(2)规定数量限定符(手机号包含多少位数);(3)规定位置限定符2.grep
2017-06-20 20:22:38
895
原创 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 如下图分析: 代码实现:class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { //后序遍历 左子树--根结点--右子树
2017-06-15 12:09:24
474
原创 树的子结构
题目是这样得:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)1.分析(1)首先设置标志位result = false,因为一旦匹配成功res就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false(2)递归思想,如果根节点相同则递归调用IsTree1HaveTree2(),如果根节点不相同,则判断tree1的左子树和tree
2017-06-01 08:28:14
472
原创 找链表中倒数第k个节点
剑指offer上有道题是这样的:输入一个链表,输出该链表中倒数第K个节点。例如:一个链表有6个节点,1--2--3--4--5--6,找倒数第三个节点就是指向4的那个节点。链表节点定义如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }}
2017-05-29 11:54:06
513
原创 多线程编程
1.线程概念; 2.有关线程的一些理解; 3.线程的控制 ; 4.获取线程的id ; 5.线程的可结合和可分离; 6.线程切换的情况; 7.在Linux环境下进程与线程的区别.1.线程概念 进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,而今天介绍的多线程是进程内部执行的一个分支,同一进程的多个线程共享同一地址空间,因此文本段、数据段都是
2017-05-28 20:57:37
646
原创 二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。例如:把9表示成二进制是1001,有2位是1,因此输入9时,该函数输出为2.1.看到这个题首先我们可能会想到的是通过不断进行移位操作来判断二进制最右边的一位是否为1,是则count++;如下代码所示:int NumberOf1(int n) { int count=0; while(n) { if(n&1) { count
2017-05-23 19:37:29
339
原创 旋转数组的最小数字
最近看了剑指offer上的这样一道题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。note:给出的所有元素都大于0,若数组大小为0,请返回0。1. 分析:对于这样一道题,遍历一遍就能找出数组中最小的那个,但是时间复杂度为
2017-05-22 20:14:15
604
原创 合并两条有序链表
有序链表的合并是面试的时候常考的一道链表算法题: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则(即升序)。 对于这道题目有两种解法:一是非递归形式,二是递归形式。 1.非递归算法,我们解题思路如下: (1)先考虑这几种特殊情况, 如果两条链表相等,我们将返回任意一条即可; 如果一条链表为空,另一条不为空,那么我们返回不为空的那条链表即可;
2017-04-27 17:03:47
746
原创 小型http服务器
为了真正理解服务器程序的本质,基于Tinyhttp服务器的基础上,实现了一个多线程http/1.0版本的小型http服务器,本文将从以下几方面介绍: (1)实现http服务器的预备知识; (2)模式处理; (3)多线程http工作的方法流程; (4)代码实现。 (注:http/1.0版本的服务器采用的是短连接,即请求-响应-断开)1.在实现http服务器之前,我们首先要了解HTTP协议,C
2017-04-14 22:00:31
1107
1
转载 HTTP协议详解(真的很牛逼)
引言HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP协议的主要特点可概括如下: 1.
2017-04-03 17:21:07
1105
转载 HTTP长连接和短连接及推送原理
本文基于两个问题讲述:1.长连接,短连接的特点及区别 2.两种连接适用场景,长连接存在的目的 3.推送服务(它是基于长连接的)HTTP长连接和短连接1.HTTP协议与TCP/IP协议的关系HTTP
2017-04-03 11:42:26
1429
转载 一个http请求发送到后端的详细过程
我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切。首先http是一个应用层的协议,在这个层的协议,只是一种通讯规范,也就是因为双方要进行通讯,大家要事先约定一个规范。1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程
2017-03-30 19:34:23
8943
2
原创 Linux下shell脚本中的字符串截取
shell中字符串截取有8种方法: 现在假设有变量 val=http://Facebook.com 1. # 号截取,删除左边字符,保留右边字符,具体看下图: 执行结果图: echo ${val#*//} 其中 val 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符,即删除 http://2.## 号截取,删除左边字符,保留右边字符,如图: 执行
2017-03-28 23:18:03
853
原创 I/O多路复用之select
在介绍select之前,我们先来了解Unix下五种I/O模型,分别有:阻塞I/O, 非阻塞I/O, 信号驱动I/O, 异步I/O以及I/O多路复用,而系统提供的select函数就是来实现多路复用I/O模型的,下面将围绕以下几方面来详细介绍一下这个函数: 1.select函数的作用; 2.select函数的头文件,原型,各个参数所代表的含义及函数返回值; 3.select模型的理解;
2017-03-23 18:18:36
770
原创 Linux下TCP多进程/多线程套接字通信
上篇文章简单的介绍了一下Linux下套接字通信的相关知识: http://blog.csdn.net/qq_29503203/article/details/60961537但是存在一个缺陷就是只能进行单进程通信,我们都知道实际上不可能一个服务器一次只能有一个客户端,所以在这里对其进行一个改进,我们通过fork出子进程去完成客户端发来的请求,而父进程只需用去accpet连接请求
2017-03-12 11:01:11
4266
2
原创 Linux下简单的socket通信
TCP套接字编程流程图:此模型不仅适合迭代服务器,也适合并发服务器,不管服务器是并发的还是迭代的,两者实现流程类似,只不过并发服务器接收客户请求(accept)后会fork子进程,由子进程处理客户端的请求,而迭代服务器则会一直处理客户端的请求直至请求结束,因此在这期间不会再响应其他客户端的请求。
2017-03-10 21:32:41
7212
原创 TCP中的三次握手和四次挥手
本文将主要从以下几方面进行介绍:TCP的段格式三次握手四次挥手的详解过程连接建立和释放过程中的状态转换几个有关TCP连接和释放连接的常见问题1. 在介绍TCP的三次握手和四次挥手过程之前,我们先来看看TCP报文段格式以及其内容代表的含义.2.三次握手,四次挥手的详解过程(1) 三次握手的建立下面再通俗的模拟一下这个过程:
2017-03-08 18:21:23
806
原创 TCP使用的四种计时器
本文将围绕TCP中为什么有计时器,计时器的种类以及它们各自的特点来阐述。TCP中为什么要设置计时器 TCP 是提供给可靠的传输层,它使用的方法之一就是确认从另一端收到的数据,但是数据和确认都可能会丢失。TCP 通过在发送时设置一个定时器来解决这个问题。如果当定时器溢出时还没收到确认,它就会重传该数据(关键在于超时和重传策略,即怎样决定超时的时间间隔和如何确定重传的频率
2017-03-06 14:52:11
2631
原创 gdb调试多线程
gdb的线程调试命令将在下面边调试边介绍,下面先给出示例代码:示例代码:#include#include#include void* pthread_run1(void* arg){ int count=5; while(count--) { printf("hello world!\n"); sleep
2017-03-05 19:14:18
708
原创 gdb调试多进程
先前我们初步了解了一些有关gdb调试的基本命令,今天我们尝试着用它来调试多进程和多线程,看看在调试过程中它们是如何切换的。gdb调试多进程1. 默认设置下,在调试多进程程序时gdb只会调试父进程,但是为了可以对父进程和子进程都做到调试,gdb新版本就附加了调试子进程的功能。但需要设置follow-fork-mode(默认值:parent) 和 detach-on-fork(默认
2017-03-05 16:36:32
631
原创 可重入函数与线程安全的区别与联系
本文主要介绍一下可重入函数与线程安全的区别与联系,在此之前我们先来了解一些基本概念:什么是线程全函数,什么是可重入函数?线程安全函数概念线程安全的概念比较直观,一般来说,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。确保线程安全要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一线程的不同进程会共
2017-02-24 13:24:17
1076
原创 Linux下的静态库和动态库
Linux下有静态链接库和动态链接库两种,本文就其区别,生成静态库动态库的有关gcc命令以及生成静态库动态库的方法作一介绍。一.静态库和动态库的区别:1.静态链接库的后缀名是.a,动态链接库的后缀名是.so;2.静态链接库是指程序在编译链接的过程中所有使用到的函数库都会被加载到目标文件中,这种处理方式的优点是编译后的执行程序不需要外部函数库的支持,同样的这种处理方式既是它的优点,同时也
2017-02-18 00:04:38
606
原创 进程的调度算法
一个线程/进程要经历5个状态,创建,就绪,运行,阻塞,终止。如下图是操作系统的线程/进程的状态模型:今天我们重点研究一下进程由就绪到运行这一过程中的系统调度,通常在并发运行中,CPU需要在多个进程之间来回切换,那么切换就有一些策略,这就是我们今天的主题---进程的调度算法:注明:并发与并行的区别,并发指的是在一个时间段内,有几个进程都在同一个CPU上运行,但任意一个时刻
2017-01-22 15:26:23
891
原创 浅析Linux下的task_struct结构体
本文的重点是剖析task_struct,在这之前我们需要先了解一下进程的概念和Linux下进程控制块PCB。1.首先什么是进程?1.1进程可以这样描述:1>进程是程序的一个执行实例; 2>进程是正在执行的程序; 3>进程是能分配处理器并由处理器执行的实体。按内核观点来谈进程:它担当分配系
2017-01-19 23:20:12
19652
原创 Linux中实现一个简单的进度条
说起进度条,其实大家常常见到,比如说你在下载视频或文件的时候,提示你当前下载进度的就是我们今天要说的进度条,进度条的模拟实现是挺简单的,但是要做的比较实用还是需要注意很多地方的,下来我就一步步的深入分析一下进度条得实现。1.起初写下了这样的代码,解释以下几点:1>首先我们需要将[ ]固定在左右两边,中间预留下空间,然后用“=”进行填充。这里printf("[%-100s]\r",str);
2017-01-01 13:48:43
5708
3
原创 Linux下的find指令
Linux下find命令提供了相当多的查找条件,功能很强大,但是不到万不得已的时候是不会用它来查找文件的,因为它存在两个缺陷:一是查找速度慢,二是费硬盘。 通常情况下,我们都是先使用whereis或者locate来查找,如果真的找不到了,才用find来查找。这里需要明白一点的是linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和locate时,会从
2016-12-28 11:37:39
8038
2
原创 Linux下的atime mtime ctime及如何用touch来修改
Linux文件下通常有三个时间参数:(1)modification time(mtime):内容修改时间 这里的修改时间指的是文件的内容发生变化,而更新的时间。(2)change time(ctime):状态修改时间 这里的修改时间指的是文件的属性或者权限发生变化,而更新的时间。(3)access time(atime):最后访问
2016-12-26 12:08:44
6576
2
原创 简单实现一个固定大小的内存池
1.内存池的引入 (1)内存池顾名思义就是存放内存的池子,直接分配一大块内存存起来,然后慢慢地切出来使用,用完了再还回到池子,后续还能再利用。 (2)如果我们需要申请一块空间,我们一般都会动态开辟一块空间(new或malloc),它们两个的共同点就是在堆上去申请空间,当然也是有一定限制的。如果我们频繁的去申请释放空间,就会造成许多的内存碎片,内存的浪费也就产生了。如果
2016-12-07 09:42:51
1079
原创 二叉树经典面试题
求二叉树中最远的两个节点的距离,对于这样一个题经过画图分析总体来说有一下几种情况:分析:我们可以考虑递归算法,进行后续遍历的同时,将每一个节点左右子树的距离通过传引用的方式将其带回,如果当前节点的左右子树距离大于前一节点的左右子树距离,那么就更新这个distance.代码实现:templatestruct BinaryTreeNode{ Binar
2016-11-28 08:58:01
985
原创 计数排序
计数排序是一种费比较的排序算法,它的思想其实很简单,就是先开辟一块空间用来存放数据出现的次数,然后就要统计出数据出现的次数,并将其放在对应的位置下标上,最后我们可以根据统计的次数依次还原出来就有序了,如下图分析:代码实现:void CountSort(int* a,int n){ assert(a); int max=a[0]; int min=a[0]; //1.先统计
2016-11-27 13:26:19
341
原创 归并排序
归并排序(MergeSort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序,它采取分而治之(Divide-and-Conquer)的策略,时间复杂度是O(N*lgN)。归并排序的步骤如下:1. Divide: 把长度为n的输入序列分成两个长度为n/2的
2016-11-27 11:32:01
348
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人