自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Makefile的一些简单心得

闲来没事,决定研究一下make如何去访问层级目录:假如,如果这层目录中有一个Makefile,下层目录中也有Makefile,需要对两个Makefile进行同时编译,怎么做呢?第一层目录如下:下层目录如下:怎样让这两个Makefile同时编译呢?外层Makefile内层Makefile执行结果:

2017-02-15 17:27:14 324

原创 函数指针的作用以及好处

//函数指针使用的例子#include #include char * fun(char * p1,char * p2){  int i = 0;  i = strcmp(p1,p2);   if (0 == i)  {    return p1;  }  else  {    return p2;  }} int main(){  char * (*pf

2016-08-21 00:44:35 8907

原创 shell脚本

用shell脚本语言写了两个小程序,贴出来希望大家指点:实现简单的进度条:运行结果:接下来,在file文件中,有三个数,找出最大、最小以及平均数运行结果:欢迎大家提意见!

2016-08-18 20:57:30 277

原创 网络编程-套接字(scoket)

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

2016-08-07 17:00:38 478 1

原创 为什么一定要是三次握手,四次挥手

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK)

2016-08-05 16:35:59 1037 1

转载 TCP的三次握手,四次挥手

TCP使用窗口机制进行流量控制什么是窗口?连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端接收方发送的确认信息中包含了自己剩余的缓冲区尺寸剩余缓冲区空间的数量叫做窗口2. TCP的流控过程(滑动窗口)TCP(Transmission Control Protocol) 传输控制协议三次握手TC

2016-08-05 16:04:35 221

原创 网络的基础IP、IP分片、路由表

网络协议栈:数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上 时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)1.每一层都把自己的信息添加到报头处。(所以在每一层中包括两部分信息:报头信息和有效载荷)2.每一层协议都认为自己接收到的是有效载荷信息IP数据包格式

2016-08-05 15:38:19 1078

原创 Linux中的进程组、作业以及会话

进程组   每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。 通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯 一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。 组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是

2016-08-04 13:18:36 461

原创 死锁

死锁的定义:如果一组进程(线程)中的每一个进程(线程)都在等待仅由该组进程(线程)中的其他进程(线程)才能引发的事件,那么该组进程(线程)是死锁的。常见的死锁现象是如何产生的呢?一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁, 因此就永远处于挂

2016-07-29 22:59:30 239

原创 可重入函数和线程安全

可重入函数当捕捉到信号时,不论进程的主控制流程当前执行到哪儿,都会先跳到信号处理函数中执行,从信号处理函数返回后再继续执行主控制流程。信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。引入了信号处理函数使得一个进程具有多个控制流程,如果这些控制流程访问相同的全局资源(全局变量、硬件资源等),就有可能出现冲突,如下面的例子

2016-07-27 22:37:44 277

原创 Linux中的信号(2)

在上篇博客中,主要介绍了信号的基本概念,这次我主要介绍一下与信号相关的函数以及对它们的应用。sigaction函数#include int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);sigaction函数可以读取和修改与指定信号相关联的处理动作。调用成功则返回0,出错则

2016-07-27 21:44:47 355

原创 Linux中的信号(1)

首先,我们来看一下Linux中都有那些信号:每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到。然后来看一下产生信号的条件: 1. ⽤户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号(可使前台进程停止,这个信号

2016-07-26 23:52:56 1796

转载 信号量操作函数中的SEM_UNDO

每一个独立的信号灯操作可能都需要维护一个调整动作。 Linux 至少为每一个进程的每一个信号灯数组都维护一个 sem_undo 的数据结构。如果请求的进程没有,就在需要的时候为它创建一个。这个新的 sem_undo 数据结构同时在进程的 task_struct 数据结构和信号灯队列的 semid_ds 数据结构的队列中排队。对信号灯队列中的信号灯执行操作的时候,和这

2016-07-26 20:51:21 727

原创 进程间通信--管道的实现方式

一.管道的基本概念本质:不同的进程可以看到相同的系统资源进程退出,管道关闭释放。管道实现的原理:     创建子进程的时候子进程会继承父进程的文件描述符表特点:     (1)只能实现单向通信     (2)适用于有血缘关系的进程(多用于父子进程)     (3)面向字节流的服务     (4)依赖文件系统     (5)匿名管道

2016-07-26 11:19:04 1370

翻译 AVL树的简单实现

在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文《An algorithm for th

2016-07-25 22:44:55 641

原创 Linux中程序的栈帧分析以及修改函数地址

首先,我们来看一个小程序:在这个程序中,我们并没有调用fun()函数,为什么会重启呢?在main函数中,调用了fun1()函数,p--后,将栈帧上p的下一个位置指针(fun1函数调用完后的下一条指令的地址)改为fun函数的地址,运行完fun1函数后默认运行p的地址,跑去调用fun函数。那怎么样不通过变量名来修改栈帧上变量的内容看下面一个程序:猜一下结果输

2016-06-11 22:06:21 436

转载 task_struct结构体字段介绍--Linux中的PCB

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,task_struct是Linux中的【进程控制块PCB结构】的具体数据结构这个结构体包含了一个进程所需的所有信息。它定义在linux-2.6.38.8/include/linux/sched.h文件中。下面对task_struct这个结构体 进行各个字段的详细介绍1. 调度数据成员

2016-06-11 17:10:13 2940

原创 操作系统中的几种常见进程调度算法

首先来看下集中常见的进程调度算法:1.先来先服务调度算法2.短作业优先调度算法3.优先级调度算法4.高响应比优先调度算法5.轮转调度算法6.多级反馈队列一、先来先服务和短作业(进程)优先调度算法  1.先来先服务调度算法。先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作

2016-06-11 16:20:49 19855

原创 各种基本排序(直接插入;希尔;选择;堆;冒泡;快排)

我们所知道的各种排序办法有:1.直接插入排序算法思想:在一个已知的排好序的序列中,插入一个数据,使更新后的序列保持有序//直接插入排序//O(N^2)void InsertSort(int * a, int size){ assert(a); for (int begin = 1; begin < size; begin++) { int tmp = a[begi

2016-06-03 15:54:19 400

原创 Linux 中的Makefile 的一些简单使用

Makefile会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 一般来说,无论是C、C++、还是 pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下 是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(l

2016-06-01 19:12:15 1924

原创 堆的一些简单应用

查找数据10000个数中找出最大的前100个数创建一个100个数的小堆,最上面的数是这100个数中最小的;然后依次遍历(从101到10000),如果比它大,替换它。代码实现如下:https://github.com/HandsomeBoby/Heap/blob/master/GetTopK.h堆排序使用大堆进行数组的排序代码实现如下:https://github.com/HandsomeBoby/

2016-06-01 19:01:46 207

原创 Linux 中的find指令

Linux中的find是一个很强大,很有用的一个指令。它的主要作用就是在文件树中查找对应的文件。find的命名格式//fing + 查找路径 +命令选项find pathname -options2.find的一些命令选项-name   按照文件名查找文件。-perm   按照文件权限来查找文件。 -user   按照文件属主来查找文件。 -group  按照文件所属的组来查找文件。 -nogr

2016-06-01 19:01:44 397

原创 堆的简单实现(仿函数)

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。最大堆:每个父节点的都大于孩子节点。最小堆:每个父节点的都小于孩子节点。堆结构的二叉树存储是:650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/80/06/wKiom1c0c7LBwZGrAAB2OesT9u0148.png" title="QQ截图2016051220142

2016-06-01 19:01:41 205

原创 线索化二叉树

二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。enum PointerTag {THREAD, LINK};template class T>struct 

2016-06-01 19:01:38 181

原创 二叉树遍历的非递归实现

二叉树的遍历可以使用递归的方式实现,并且代码非常简单。而递归实际就是函数反复的调用本身,在栈上反复压栈。所以我们可以用栈来模拟实现递归。1.前序遍历  (1)栈是后进先出的特点,所以无条件的把栈的根节点入栈,在把栈顶元素输出之后依次把右孩子,左孩子压入栈中。代码如下:void _PrevOrder(Node * root) { stack s; if (root == NULL) {

2016-06-01 19:01:35 202

原创 c++实现二叉树(递归)

首先先来看一下树的结构:树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树。650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;bord

2016-06-01 19:01:32 346

原创 c++实现广义表

广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。     A = () B = (a,b) C = (a,b,(c,d)) D = (a,b,(c,d),(e,(f),h))  E = (((),()))如下图所示:650) this.width=650;" src="http://s5.51cto.com/wyf

2016-06-01 19:01:29 801

原创 特殊矩阵的压缩存储

对称矩阵及对称矩阵的压缩存储  设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0   压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据。对称矩阵和压缩存储的对应关系:下三角存储i>=j,SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]。650) this.width=650;" src="/e/u

2016-06-01 19:01:26 594

原创 栈的一些小小应用

昨天刚实现了栈的一些基本操作,今天就来实现一点栈的应用把!首先,写一点比较简单的:1.逆波兰表达式的计算。     在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。逆波兰表达式也称为后缀表达式。比如:   650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/7E/E4/wKiom1cLyhbh

2016-06-01 19:01:23 417

原创 c++实现栈的基本操作

栈的定义    栈(Stack)又称堆栈,是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。 栈有两种实现的方式。一种是顺序存储,和数组类似;一种是链式存储,和单链表类似。650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/7E/D0/wKiom1cJAafxAH8-AABXBkMBS7I061.png" title

2016-06-01 19:01:20 12758

原创 linux 系统的 ctags 以及Makefile的应用

1.ctags(Linux代码查看)ctags -R :在当前目录下建立索引。 ctrl + ]: 跳转到函数或变量的定义处ctrl + T  :  跳转至上级 2.Makefile的应用会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

2016-06-01 18:46:36 359

原创 Linux 中实现进度条

想要实现进度条的小程序,首先必须知道:(\r以及\n的区别)在Windows操作系统下:Enter键我们都知道是换行的意思,实际上不是的,它的意思是回车换行\r  回车:使光标回到这一行的行首\n  换行:使光标到下一行如果按照数学上的观点去描述的话;在一个坐标轴上,\r 改变x轴使其到零点,y轴不变                           

2016-05-31 22:05:33 486

原创 哈希表(散列表)

哈希表,根据关键字(key)直接访问在内存存储位置的数据结构。它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表。构造哈希表的几种方法直接定址法--取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。 除留余数法--取关键值被

2016-05-25 21:39:46 427

空空如也

空空如也

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

TA关注的人

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