自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

YANG

临渊羡鱼不如退而结网

  • 博客(84)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 了解Gtest中的事件机制

引入事件机制 举例:我们使用gtest框架测试STL中的map这个数据结构时,我们假设只测find(),size()这两个函数,如果不使用事件机制,则测试的TEST()部分如下: 我们可以看到,在每一个TEST内部都创建了一个map结构,并进行了插入操作,这样就做了很多重复的事情。其实gtest提供了三种事件机制,就是提供一个机会,使得在测试之前/之后能够准备/清理一些数据。(联系一下C++里的构

2017-08-05 10:46:10 5175 2

原创 22题:栈的压入、弹出顺序

题目描述输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否是栈的弹出序列。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。‘思路分析首先考虑这个问题肯定是需要一个辅助栈,方便后边讲思路,我们将压入序列称为pushV,弹出序列称为popV,按照pushV将

2017-06-29 12:28:20 2954 1

原创 进程间通信:消息队列&信号量&共享内存

进程间通信之管道,点击这里: http://blog.csdn.net/qq_33951180/article/details/68959819消息队列:消息队列是一种进程间发送二进制数据块的机制,每个数据块都有特定的类型,接受者进程可以有不同的类型值。信号量:共享内存:

2017-06-21 10:24:08 2216

原创 二叉树的镜像

题目描述完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};

2017-06-19 14:50:23 953

原创 Shell---循环结构

Shell下的循环结构是类C的,同样也有for循环、while循环,此外,Shell也有until循环。for循环for循环的基本语法for variable in {list}do statement1 statement2 ...donefor循环的语法意思与C语言一样,即执行循环体的次数由list决定。list在这里是一个列表,可以是一系列的数字或字符串,元素之

2017-06-12 14:43:41 2470

原创 信号

信号的基本理解什么是信号 提到信号,大部分人的第一反应都是红绿灯,没错,这是日常生活中的一种信号,它给了人们提示,当各种颜色的灯亮起时我们应该做什么样的处理动作。不过我们今天说的信号时Linux下的信号(signal),我们回想一种场景,当我们在Linux下打开一个终端,假设现在正有一个进程在运行,它的工作就是不断循环输出“hello”,此时,当我们按下Ctrl-c时,这个进程就会被终止掉。在此

2017-06-07 20:09:39 549

原创 多线程实现生产者与消费者模式

生产者-消费者模式的简介:在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者。但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介,生产者产生的数据放入缓冲区,消费者从缓冲区读取数据并处理。(注:上述所说的模块是广义的,可以是类,函数,线程,进程等)我们可以将这二者之间的关系图表示出来:总结:我们用3-2-1的方法来简单描述一个生产者

2017-06-01 10:08:07 10302 3

原创 线程的同步与互斥:条件变量&信号量

条件变量与互斥锁一样,都是一种数据变量,这两者通常搭配起来使用。条件变量的作用:实现线程的同步与互斥:接口:

2017-05-31 21:40:45 3798 1

原创 线程的同步与互斥:互斥锁

什么是线程的同步与互斥?同步:假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但他们之间存在一种制约关系,即当线程A写的时候,B不能来拿数据;B在拿数据的时候A不能往缓冲区写,也就是说,只有当A写完数据(或B取走数据),B才能来读数据(或A才能往里写数据)。这种关系就是一种线程的同步关系。互斥:对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当

2017-05-29 11:13:07 18519 1

原创 重建二叉树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如图所示的二叉树并输出它的头结点。 分析及实现:思路分析 根据二叉树前序遍历的特点(根-左-右),每次读取的第一个值一定是根节点,这样我们可以在中序遍历的序列中找到

2017-05-28 10:24:26 7485 4

原创 旋转数组的最小数字

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数组。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的旋转数组,该数组的最小值为1。思路解析:O(N)的算法 这种算法的思想就是遍历这个数组,由于这个数组是两部分有序的数组,因此遍历这个数组时当后一个数字小于前一个数字时,则后一个(即较小)一定为整个数组中最

2017-05-25 15:51:19 895 4

原创 cut & sort & uniq 工具合集

cut命令主要接受三个定位方法:-b , -c , -fsort工具的常用选项:-u,-r,-o,-n,-k,-t,-funiq命令常用选项:-d,-u,-c

2017-05-04 13:35:26 1201

原创 awk工具

awkawk是一种文本分析工具,相对于grep的查找,sed的编辑。awk和sed都可以处理文本,awk比sed的强大之处在于处理列也是比较细致的,它可以对行(记录)、列(域)进行分析。awk默认的行分隔符是换行,列分隔符是Tab或者连续的空格(列分隔符分开的每个部分称为一个域)。awk命令行的基本形式: awk option ‘script’ file1 file2 … awk option

2017-05-02 09:22:50 1009

原创 sed工具

sed的基本格式: sed option ‘command’ file1 file2 … sed option -f scriptfile file1 file2 …sed的命令格式:sed /pattern/action pattern即正则表达式,action即编辑动作 sed默认是以Basic模式进行编辑的,在使用下列五个字符的特殊意

2017-04-28 07:45:31 1340

原创 基于HTTP协议实现的小型web服务器

我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析: 1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面) 3、服务器能进行简单的cgi运行。比如当客户在表单中输入数据后,服务器能够将运行结果返回个

2017-04-28 07:37:28 29878 8

原创 HTTP长连接和短连接

HTTP是工作在应用层的文本传输协议,它在底层的实现是基于TCP协议的,今天说的HTTP的长连接和短连接实质上是TCP的长连接和短连接。TCP的长连接和短连接:TCP的连接在客户端和服务器端之间进行数据传输时,首先需要在client和server之间建立一条通信链路,如果client和server之间不需要再传输数据或者不再需要这条链路时,就可以释放连接。

2017-04-04 16:54:44 2007

原创 匿名管道和命名管道

进程间通信(IPC)每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间中拷贝到缓冲区,进程2再从缓冲区把数据读走。内核提供的这种机制就是进程间通信。 通信需要媒介,两个进程间通信的媒介就是内存。通信的原理就是让两个或多个进程能够看到同一块共同的资源,这块资源一般都是由内存提供。匿名管道(

2017-04-03 15:02:38 19568

原创 I/O多路复用之select

I/O多路复用:I/O多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪后,它就通知该进程的应用程序,应用程序就可以马上完成响应的I/O操作,而不需要等待系统完成I/O操作,这样大大提高了效率。I/O多路复用实质上是实现了单线程来处理并发请求。 系统为我们提供了多个函数来实现多路复用输入/输出模型,例如:select,poll,epoll,这里我们先讲select模型。一、select

2017-03-30 16:39:49 1262

原创 socket编程之实现一个简单的TCP通信

一、理解socket1、socket即为套接字,在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。 2、在TCP协议中,建立连接的两个进程(客户端和服务器)各自有一个socket来标识,则这两个socket组成的socket pair就唯一标识一个连接。 3、socket本身就有“插座”的意思,因此用来形容

2017-03-29 18:33:01 92932 2

原创 Shell 字符串截取方法

一、运算符截取 假设现在有字符串var=http://www.mmm.cn/123.html# 和 ## 号截取字符串(删左边留右边)# :${var#*string}解释:从左边开始,删除第一个string以及左边的所有字符。var为变量名,#表示截取的运算符。## :${var##*string}解释:从左边开始,删除最后一个string

2017-03-29 09:20:51 34124 1

原创 端口号的分类

端口:在网络技术中,端口有两层意思:一个是物理端口,即物理存在的端口,如:集线器、路由器、交换机、ADSL Modem等用于连接其他设备的端口;另一个就是逻辑端口,用于区分服务的端口,一般用于TCP/IP中的端口,其范围是0~65535,,比如用于网页浏览服务的端口是80端口,用于FTP服务的是21端口。端口号:由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,即就是端

2017-03-10 20:43:16 7652 1

原创 TCP的连接建立与释放

TCP --- 传输控制协议报头格式:(1)源端口和目的端口:与UDP类似,TCP的分用是通过端口实现的。(2)序号:TCP是面向字节流的,在TCP连接中传送的字节流的每一个字节都是有顺序的,整个要传送的字节流的起始序号必须要在连接建立时设置。首部中的序号字段值表示本报文段的数据的第一个字节的序号。该字段也称为“报文段序号”。(3)确认号:是期望收到对方下一个报文段的第一个

2017-03-09 15:43:24 9076

原创 替换空格

题目:请实现一个函数,把字符串中的每个空格替换成”%20”。例如:输入”we are happy.”,则输出”we%20are%20happy.”思路分析: 我们比较替换之前与替换之后的字符串长度,很明显,字符串长度增加了4,所以,第一点,将”we are happy.”用一个字符指针指向肯定不可行,那么就应该将其放入一个数组中。其次我们就应该考虑如何输出想要的结果。 1.题目没有给出要求

2017-03-07 16:55:36 1193 3

原创 TCP中的四个计时器

TCP中的四个计时器包括重传计时器、坚持计时器、保活计时器、时间等待计时器重传计时器(Retransmission Timer):目的:为了控制丢失的报文段或者丢弃的报文段。这段时间为对报文段的等待确认时间。创建时间:在TCP发送报文段时,会创建对次特定报文段的重传计时器。可能发生的两种情况:在截止时间(通常为60秒)到之前,已经收到了对此特定报文段的确认,则撤销计时器;在截止时间

2017-03-06 12:52:28 12618

原创 Linux - 使用gdb调试多进程程序

gdb是Linux下一款调试器,常用来调试c/c++代码。对于多进程的程序,gdb是如何进行调试的呢?我们接下来一起学习:方法一:attach pid 利用该命令attach到子进程然后进行调试。为方便调试,可以sleep,这样有充分的时间进行调试。 方法二:gdb wrapper 专用于fork+exec模式,不用添加额外代码,但需要X环境支持(xterm/VNC)。 方法三:follow

2017-03-04 16:03:58 2022

原创 Linux - 信号

一、信号的基本理解提到信号,大部分人的第一反应都是红绿灯,没错,这就是一种信号,它给了人们提示,当各种颜色的灯亮起时我们应该做什么样的处理动作。不过我们今天说的信号时Linux下的信号(signal),我们回想一种场景,当我们在Linux下打开一个终端,假设现在正有一个进程在运行,它的工作就是不断循环输出“hello”,此时,当我们按下Ctrl-c时,这个进程就会被终止掉。在此,我

2017-02-27 16:17:33 721

原创 可重入函数与线程安全的区别与联系

在了解可重入与线程安全之前,我们需要明确一点,可重入与线程安全是不同的概念。我们以一个例子引入可重入与不可重入:假设现在要往链表中插入一结点,而对于信号的处理也是调用insert函数,在此,insert函数被不同的执行流进入,这称为重入。但insert访问一个全局链表,有可能因为重入导致错误的结果,则insert是不可重入函数。一、可重入函数(Reentrant Function)

2017-02-24 12:30:29 960 5

原创 Linux - 进程、线程、程序之间的区别与联系

一、进程进程是一个程序的动态运行实例一个正在执行的程序能分配处理器并由处理器执行的实体内核观点:担当分配系统资源(CPU时间,内存)的实体。进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。(进程在内存中因策略或调度需求会处于各种状态)二、进程与程序的区别与联系进程是程序的一次动态运行实例,程序是可以被保存的,而进程

2017-02-23 11:13:37 2214

转载 Linux环境下段错误产生的原因与调试

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决。1. 段错误是什么一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内

2017-02-20 11:56:20 970

原创 Linux - 如何使用gcc命令生成静态库和动态库

Linux下查看是否有静态库:ar  -tv  test.a  一、库的简述简单的说,库(Library)是由系统提供的一组具有特定功能的函数的集合,是为提高开发效率和运行效率而设计的。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。静态库:静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,因此利用静态库生成的文件比较大。这类库

2017-02-18 20:33:24 3792

原创 Linux - 进程管理task_struct

·进程概念简单来讲,进程是程序的一个执行实例;是一个正在执行的程序。进程与程序的关系:进程是由程序代码和代码相关联的数据集组成。进程与程序的区别:总得来说:进程是程序加载到内存后,操作系统或给该·PCB即进程控制块(Process Control Block),是进程中的一部分,它描述了进程的基本信息。·task_struct仅

2017-01-24 16:23:23 777

原创 如何编写一个makefile

一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为马克覅了就像一个Shell脚本一样其中也可以执行操作系统的的命令。makefile带来的好处就是:“自动化编译”。一旦写好,只需要一个make命令,就可以使整个工程自动编译,极大提高了软件开发的效

2017-01-02 11:33:11 5664

原创 Linux - 实现简易进度条

1.背景知识讲解2.如何实现一个简单的进度条开始今天的内容之前,我们先来回顾一个知识,看下面一段代码(Linux下运行程序)对比上边的代码,似乎相差不大,但是运行结果却千差万别:A图代码运行结果---先输出“hello”,停3秒之后程序运行完毕;B图代码运行结果---执行程序后会先停3秒,然后再输出“hello”。

2017-01-01 16:11:35 2550

原创 Linux - sticky bit

一、粘滞位是什么?粘滞位是Linux下文件权限的一个旗标,当对一个文件设置了粘滞位后,只有owner用户或者root用户才可以对该文件进行删除或移动,但假若不对文件设置粘滞位,任何对该文件具有写和执行权限的用户都可以移动这个文件。因此,对文件设置粘滞位从一方面来将还是对文件有安全保护的。

2016-12-30 12:47:58 567

原创 Linux - find命令讲解

windows是我们使用比较熟悉的一个系统,在windows下,文件是以后缀来区分类型的,而且我们也比较熟悉在该系统下怎样去查找一个文件。由于Linux不像windows那样,可以区分文件,并且关于Linux还有一个说法就是“一切皆文件”,在这样一个系统下工作,我们不可避免的要搜索一些指定类型的文件,那么我们怎样去查找呢?!因此这就是我们今天要解决的问题。一、Linux下的查找命令有:

2016-12-28 17:00:58 691

原创 Linux - atime,mtime,ctime以及用touch指令来进行修改

Linux下的文件或目录有三种时间:访问时间(Atime):每当访问这个文件/目录后,Aeecss显示的时间就会更新一次。修改时间(Mtime):当对这个文件进行修改后,Modify显示的时间就更新一次。状态改变时间(Ctime):状态改变时间是指每次用chmod命令改变文件属性后该时间就会更新一次。Linux下的命令stat可以查看这些信息,格式是stat 文件名/目录名

2016-12-25 11:14:00 5781

原创 哈夫曼树以及文件压缩的实现

从哈夫曼树到哈夫曼编码再到文件压缩,一步步讲解,一步步实现

2016-12-22 22:20:46 24961 8

原创 设计一个简单的对象池

在将内存池之前需要先回忆一个以前听过的东西----内存碎片。一、内存碎片是什么我们都知道当需要动态开辟内存时,系统都是在堆上开辟一块空间,尽管开辟出来内存的地址是连续的一块内存空间,但每次开辟的内存块的地址并不是连续的,这样的话当我么开辟的次数变多以后,堆上就剩余许多小块的空间导致在我们需要一块比较大的空间时会开辟失败。这是我们最常听到的一种内存碎片,也成为“外碎片”。其实还有另外一种

2016-12-07 19:51:23 1719

原创 非比较排序---计数排序&基数排序

如果给出一组数:2, 2, 9, 5, 3, 9,怎样才能遍历一次该数组就能使其有序呢?!试试之间讲的算法,好像都不行。这里我给出另一种排序算法------非比较排序!非比较排序包括计数排序和基数排序。一、计数排序算法思想:很明显,计数排序当然就需要计数啦,这里就是对这组数组中相同的数据进行计数,并以每个数据的相对位置为下标,将统计出来的次数存放在一个count[ ]数组中

2016-12-03 10:41:29 654

原创 排序算法---选择排序&堆排序&冒泡排序

直接选择排序、堆排序、冒泡排序及其比较直接选择排序和堆排序都属于选择排序ps:仍以升序为例!一、直接选择排序直接选择排序的思想:选择排序就是通过n-i次关键字的比较,每次从n-i+1个记录中找出最小的关键字,将其与第i个位置的数据交换。void SelectSort(int* a, size_t size){ assert(a); int max = 0; for (size_t i=

2016-12-01 14:42:16 1317

apache-jmeter-5.0

汉化版的apache-jmeter-5.0资源下载,测试人员常用的测试工具。

2019-02-20

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

TA关注的人

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