自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux工具之grep&&sed&&awk

grep:      grep是一种行过滤工具,我们经常会用grep在一个文件中找出包含某些字符串的行,比如在头文件中中找出一个宏定义。但是grep还可以找出符合某个模式(Pattern)的一类字符串。 grep的一般格式为:grep  [选项]  基本正则表达式  [文件]常用的grep选项有:-E:扩展正则匹配-R:递归是查询-i:忽略大小写-q:安静模式匹配,不显

2017-07-03 15:56:59 420

原创 eval调研

eval可以将字符串生成执行语句,和SQL的exec()类似。eval是Javascript内置函数,用于计算字符串表达式的值。例如eval("2+3")返回的是5。        Linux中,shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。

2017-06-30 16:10:22 229

原创 进程间通信—消息队列

消息队列         消息队列提供了一种从一个进程向另一个进程发送数据块的方法。每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞问题。消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的,每个消息队列的总的

2017-06-27 21:29:55 276

原创 进程间通信—管道

进程间通信本质上让不同的进程拥有一份公共的资源。管道则是进程间通信的一种,分为匿名管道和命名管道。 管道特点: 1.管道只能用于单向通信。 2.匿名只能用于有血缘关系之间的通信,命名管道也能用于无血缘关系之间的通信 。 3.面向数据流通信。 4.管道的生命周期随进程。进程退出,管道也随之释放。 5.管道访问资源时按顺序访问,父子进程同步。管道其实是一种最基本的IPC机制

2017-06-27 17:20:46 302

原创 基于TCP协议服务器

socket编程:         在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。         在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连接的一对一关系。

2017-06-25 22:21:17 231

原创 CRC校验

CRC即循环冗余校验码,是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段可以任意选定。循环冗余检查是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。工作原理:       循环冗余校验码(CRC)的基本原理:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N , K

2017-06-22 16:06:25 1411

原创 进程间通信—信号量

信号量的本质是一种数据结构操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识,信号量在此过程中负责数据结构的互斥,同步等功能。       当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用。当进程不再使用一个信号量控

2017-06-19 17:26:22 294

原创 AVL树的实现

AVL树的概念:一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:1.它的左右子树都是AVL树2.左子树和右子树高度之差(简称平衡因子)的绝对值不超过(-1,0,1)如果一棵二叉搜索树是高度平衡的,它就是AVL树,如果它有n个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n))。AVL在构建时,插入的每一个节点都需要满足搜索二叉树的性质,但同时也要保证左右子树

2017-06-16 17:10:46 311

原创 进程死锁

首先,我们来了解一下什么是进程死锁。       所谓进程死锁,就是如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的的发生,也就是进程不能实现同步。 产生死锁的原因: 1.系统资源不同。 2.进程(线程)推进的顺序不当。 3.资源分配不当。 产生死锁的四个必要条件: 1.互斥条件:资源不能共享,只能由一

2017-06-15 20:21:51 293

原创 进程等待及子进程异步等待方式

首先我们来看两个函数,wait和waitpid函数。      一个进程在终止时会关闭所有的文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息;如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。      当一个进程正常或异常终止时,内核就

2017-06-15 12:33:22 405

原创 BSTree树的实现

二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树1.若它的左子树不为空,则左子树所有结点的值都小于根节点的值。2.若它的右子树不为空,则右子树所有结点的值都大于根节点的值。3.它的左右子树也分别为二叉搜索树。下面是关于二叉搜索树的实现,其中比较难以操作的就是删除操作。我们来分析一下删除操作都有哪几种情况:首先查找元素是否在二叉搜索树中,若不存在,则返回;

2017-05-27 18:17:57 550

原创 Linux下file_struct以及文件描述符

首先我们来简单看看进程与程序的区别       程序可以理解为硬盘上的普通二进制文件;进程是加载到内存中的二进制文件,除了加载到内存中的二进制文件外,还附有所有对于该二进制文件描述信息的结构体,描述该进程的结构体叫PCB(进程控制块),这在前文中已经介绍,在这就不在讨论。对于程序与进程,也就可以简单地理解为是否有PCB(进程控制块)。下面我们再来讨论PCB与file_struct的关系。 

2017-05-21 09:51:31 3551

原创 从尾到头打印链表每一个节点的值

题目描述:            输入一个链表,从尾到头打印链表每个节点的值。       分析:从尾到头输出,可利用递归来实现。

2017-05-04 22:37:16 328

转载 二叉树前序、中序、后序遍历非递归写法的透彻解析

目录(?)[+]前言在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的:    [cpp] view plain copy //

2017-05-04 18:49:21 307

原创 替换空格

题目描述:       请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串中为We Are Happy。则经过替换后的字符串为We%20Are%20Happy。         解题思路:要进行替换,是在原有的字符串上进行替换,还是需要开辟一个新的空间来进行替换,在这里,假设原字符串的空间足够,那么我们需要考虑第二个问题,就是要从前往后替换还是从后往前替换,从前往后替换字

2017-05-02 19:52:45 196

原创 二维数组的查找

题目描述       在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

2017-04-24 17:00:55 199

原创 浅谈进程与task_struct

进程的概念      OS:程序的一个执行实例。正在执行的程序。能分配处理器并由处理器执行的实体。      内核观点:担任分配系统资源(CPU时间,内存)的实体。      进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关联的数据集。进程是一种动态描述,但是并不代表所有的进程都在运行。进程在内存中因策略或调度需求,会处于各种状态,这个我们到后面再来讨论。

2017-04-21 14:23:35 365

原创 模板&泛型编程

泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础。      模板分为类模板和函数模板。函数模板代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。          如上例所示,就是一个简单加法函数的模板,typename是用来定义模板参数的关键字,也可以使用class,T代表着传入实参的类型,可以为int,flo

2017-04-15 20:28:16 499

原创 浅谈智能指针shared_ptr

首先什么是智能指针?      RAII:资源分配即初始化,通俗点来讲,就是定义一个类来封装资源的分配和释放,再构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。      实现机制:是利用类的构造和析构函数(释放资源)是由编译器自动调用的。      智能指针不仅管理执行对象的释放问题,还可以像指针一样的使用。      C++标准库中主要

2017-04-12 18:19:39 325

原创 日期类的实现

代码如下:#pragma once#includeusing namespace std;#include#includeclass Date{public: Date(int years = 1900, int month = 1, int day = 1); Date operator+(int day); Date& operator+=(int day); Da

2017-04-12 18:04:23 266

原创 单链表C语言实现

单链表相比于顺序表来说,优点在于头部,中间插入比较高效,但操作较为复杂,空间利用率低,并且CPU顺序表比链表缓存效率高。下面来看代码实现:#include#include#includetypedef int DataType;typedef struct Node{ DataType data; struct Node* next;}*PNode,Node;//初始化

2017-04-11 10:25:14 301

原创 简单实现静态/动态顺序表

静态顺序表操作较为简单,空间利用率高但里面需要注意的是排序的实现,以及二分查找,这些都是面试中常考的点。

2017-04-09 21:34:13 333

原创 关于String类浅拷贝引用计数问题

前面我们探讨了String类中深浅拷贝问题,相比于浅拷贝来说,深拷贝的效率较低,在深拷贝中,每拷贝一个对象就需要开辟空间和释放空间,赋值运算符重载也一样需要重新开辟和释放空间。可是当拷贝和赋值的对象只用于"读",而不是用于"写",我们就可以不用重新开辟空间。由此,有了引用计数的浅拷贝。       我们需要使用一个变量可以标记同一块空间同时这块空间有多个对象在使用,当析构时,先判断这个标记的变

2017-04-08 16:01:17 347

原创 Linux中find指令

当我们想要在Linux中查找某个文件,但不知道放哪里了,我们可以使用下面的命令来搜索:         which       查找可执行文件位置         whereis    查找文件的位置         locate       配合数据库查看文件位置         find           实际搜寻硬盘查询文件名称         当然,这里我们只讨论fi

2017-03-29 20:29:15 351

原创 Linux系统下粘滞位的使用

粘滞位(Stickybit),或粘着位,是Unix文件系统权限的旗标。最常见的用法在目录上设置粘滞位,如此一来,只有目录内文件的所有者或者root才可以删除或移动该文件,如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动文件。实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。        如下图所示:               

2017-03-29 18:00:43 317

原创 关于string类的深浅拷贝问题

String类深浅拷贝

2017-03-28 21:41:39 243

转载 C语言中字符串系列的函数实现以及注意事项

**str系列函数的由来** 字符串是一中重要的数据类型,但C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中。字符串常量很适用于那些不会对它们进行修改的程序。所有其他字符串都必须存储于字符数组或动态内存的分配中。因此就出现了处理字符串的一系列函数,下面让我们一一来认识这些函数。1、strlen 求字符串长度字符串长度就是它所包含的字符个数

2017-03-28 14:24:24 501

原创 类型萃取

在C++中,我们可以通过typeid来获取一个类型的名称,但是不能拿来做变量的声明。在C++中,我们可以通过类型萃取的方式来对内置类型和普通类型进行区分。例如将要看到的例子,如果是内置类型,string类存在浅拷贝的问题,所以必须采用值拷贝,若不是内置类型,则可调用memove拷贝函数来进行拷贝。struct TrueType{ bool Get() { return true;

2017-03-27 12:28:20 281

原创 Linux下文件权限问题

首先,文件权限的访问者分为三类:A:文件和文件目录的所有者,B:文件和文件目录的所有者所在组的用户,C:其他用户。      下面我们来看看文件访问的基本权限:1.读权限:Read对文件而言,具有读取文件内容的权限;对于目录来说,具有浏览该目录信息的权限。2.写权限:Write对于文件而言,具有修改文件内容的权限;对于目录来说具有删除移动目录内文件的权限。3.执行权限:execute对文件而言

2017-03-24 11:10:54 845

原创 动态多态以及多态调用过程

多态分为静态多态与动态多态。静态多态包括函数重载,泛型编程。动态是虚函数的使用。        静态多态是指编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用的那个函数,如果有对应的函数就调用该函数,否则会出现编译错误。        动态多态,我们在这里主要说明的是动态多态。        动态绑定:在程序执行期间(非编译器)判断所引用对象的实

2017-02-26 15:07:22 3915

原创 继承

继承是面向对象程序设计使代码复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。         三种成员访问限定符:public,protected,private;继承关系则也有三种:public(公有继承),protected(保护继承),private(私有继承)。         如上图所示,三种继承方式下,不同成员在子类中的访问权限。

2017-02-25 18:23:00 277

原创 关于拷贝函数的实现解析

关于拷贝函数分为两类,一类是strcpy,strncpy,第二类是memcpy,memove,通常情况下,第一类只能处理char,char*的字符串类型,第二种可以处理任意类型,它们四个函数都在C语言的库函数中,头文件为string.h。它们的原型分别如下:char *strcpy( char *strDestination, const char *strSource );cha

2016-12-01 21:35:17 510

原创 函数调用原理—栈帧

关于栈      栈在地址空间中是向下生长,向下生长是指是从内存高地址到低地址的路径延伸,栈有栈顶和栈底,所以栈顶的地址要比栈底的地址低,对于x86体系的CPU而言,其中寄存器ebp可称为“帧指针”或“基底指针”,通常指向栈底,寄存器esp可称为“栈指针”,通常指向栈顶。       ebp在未受改变之前始终指向栈帧的开始,也就是栈底。所以ebp的用途是在C堆栈中寻址用的。esp是会随着数

2016-11-16 20:49:22 325

原创 程序环境(编译(预处理),链接)

在ANSIC的任何一种实现中,存在两个不同的环境。第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令。第二种是执行环境,它用于实际执行代码。翻译阶段的几个步骤:1.组成一个程序的每个源文件通过编译过程分别转换成目标代码。2.每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人

2016-11-02 18:00:25 258

空空如也

空空如也

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

TA关注的人

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