自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 select、poll、epoll的区别

I/O多路转接之select    系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构

2016-08-09 23:09:12 1095

原创 socket编程之简单的TCP服务器

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

2016-08-06 00:11:25 5500

原创 TCP传输控制协议

一、 TCP协议      TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。TCP的特点有:1. TCP是面向连接的运输层协议2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

2016-08-03 22:48:50 1381

原创 IP数据包的格式及分片

一、IP数据包的报文格式   首先我们需要了解数据报的格式:1-1.版本4位,表示版本号,目前最广泛的是4=B1000,即常说的IPv4;相信IPv6以后会广泛应用,它能给世界上每个纽扣都分配       一个IP地址。1-2.头长4位,数据包头部长度。它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(红色部

2016-08-01 22:32:33 18641

原创 死锁的产生原因和解除

死锁的定义如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的时间,那么该组进程是死锁的。产生死锁的必要条件互斥条件:简单的说就是进程抢夺的资源必须是临界资源,一段时间内,该资源只能同时被一个进程所占有请求和保持条件:当一个进程持有了一个(或者更多)资源,申请另外的资源的时候发现申请的资源被其他进程所持有,当前进程阻塞,但不会是放自己所持有的资源不可抢占条件

2016-07-29 15:38:06 5335 2

原创 Linux信号

首先我们先来看看常用的信号都有那些说明:信号一共有62个,可能很多人都会像我一样被欺骗,实际上中间没有32,33信号。1-31好信号为普通信号,34-64为实时信号 接下里就让我们来了解一下信号的产生条件:1.用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIG

2016-07-29 11:06:53 736

转载 可重入函数与线程安全

若一个程序或子程序可以“安全的被并行执行(Parallel computing)”,则称其为可重入(reentrant或re-entrant)的。即当该子程序正在运行时,可以再次进入并执行它(并行执行时,个别的执行结果,都符合设计时的预期)。可重入概念是在单线程操作系统的时代提出的。一个子程序的重入,可能由于自身原因,如执行了jmp或者call,类似于子程序的递归调用;或者由于硬件中断,UNIX系

2016-07-27 22:19:15 973

原创 Linux进程通信(四)IPC共享内存

一、什么是共享内存进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将在特殊文件系统shm中,创建并打开一个同名文件

2016-07-25 15:54:43 760

原创 Linux进程通信(三)IPC信号

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

2016-07-25 11:58:11 891

原创 Linux进程通信(二)IPC消息队列

一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度MSGMNI来限制消息队列的

2016-07-24 12:36:10 1108

原创 Linux进程通信(一)管道

管道:管道是进程间通信的主要手段之一。一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端。管道是一种特殊的文件,它不属于某一种文件系统,而是一种独立的文件系统,有其自己的数据结构。根据管道的适用范围将其分为:无名管道和命名管道。●     无名管道主要用于父进程与子进程之间,或者两个兄弟进程之间。在linux系统中可以通

2016-07-19 10:20:53 1233

原创 如何定义一个只能在堆上(栈上)生成对象的类?

类的对象的生成在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。动态建立类对象,是使用new运算符将对象建立在堆空

2016-07-09 13:03:08 907

翻译 最详细的红黑树解析

红黑树红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实

2016-07-09 10:49:28 4540 1

原创 Linux进程创建函数vfork简介

基础知识vfork和fork的区别和联系vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork都创建一 个子进程,但它不将父进程的地址空间复制到子进程中,因为子进程会立即调用 exec,于是不会存访问该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。另一个区别是vfork保证子进

2016-07-04 22:10:13 1161

原创 LInux 子进程创建函数fork简介

一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。调用成功时两个返回值1)父进程返回当前子进程pid(子进程的标识符)2)子进程返回0(找父进程使用getppid())调用失败返回-1。接下来就用一个简

2016-07-02 22:48:41 827

原创 Linux 程序运行栈帧

我们知道C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现函数调用的一种数据结构。那么在Linux下gcc编译器栈帧是怎么实现的呢?首先先来看一段程序:猜猜程序运行的结果是什么?你会发现你的系统会立马重启。这是为什么呢,这就是程序运行的堆栈在作怪!!下边这张图会让你很清楚的理解分析:

2016-06-26 12:47:47 826

原创 Linux进程管理之task_struct

大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进程描述符,具体是task_struct结构体存储相关的信息,在linux/sched.h文件里定义,那么我们先看看linux内核3.0版本的task_struct结构体的定义吧(删除了不必要的字段,只保留了重要的字段)。struct task_struct { //这个是进程的运行时状态,-1代表不

2016-06-07 19:24:32 399

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

一、先来先服务(FCFS)和短作业(SJF)优先调度算法1.先来先服务(first-come first-sereved,FCFS)调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程

2016-06-05 16:53:39 1348

原创 ctags 和Makefile的简单使用

ctagsctags是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。(尤其是大型的工程)一、安装ctags1、命令行安装切换到root用户之下,输入yum install ctags2、下载源码安装(网上提供的方法)       1)从http://ctags.sourcefor

2016-05-29 17:23:12 1230

原创 如何将你的vim配置的“高大上”

vim对于一个经常在linux进行编程的程序员,将vim 配置的高大上是一个程序员的基本素养。接下来就来给大家介绍一下如何简单的配置vim首先来上一张效果图650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/82/0C/wKioL1dJQDKwmT5_AADE1nIaqjo231.png" title="QQ截图20160528144

2016-05-29 17:23:09 867

原创 Linux中常用的查询指令(which、whereis、find、locatae)

我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:Which   查看可执行文件的位置。whereis 查看文件的位置。locate  配合数据库查看文件位置。Find    实际搜寻硬盘查询文件名称whichwhich命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which 命令,就可以看到某个系统命令

2016-05-29 17:23:06 1918

原创 二叉树的非递归遍历

templatevoid BinaryTree:: PrevOrderNoRec(){ if (_root == NULL) { return; } stack s; s.push(_root); while (!s.empty()) { Node* top = s.top();//获取栈顶 cout _data << " "; s.pop(); //右孩

2016-05-29 17:23:03 316

原创 二叉树的简单递归实现(创建,遍历,高度,大小)

二叉树二叉树:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子满二叉树:高度为N的满二叉树有2^N - 1个节点的二叉树。650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/7F/4C/wKioL1cZjXugbIznAAAYPuFdxLA661.png" title="QQ截图2016042210290

2016-05-29 17:23:01 793

原创 广义表的递归实现

广义表的定义广义表是非线性的结构,是线性表的一种扩展,是有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:/

2016-05-29 17:22:58 1082

原创 稀疏矩阵的压缩

稀疏矩阵的特点M*N矩阵,矩阵中有效值的个数远远小于无效值的个数,并且这些数据的分布没有规律。例如下面的矩阵650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/7F/18/wKioL1cTnG_RdM91AAAM4xL6kRc377.png" title="QQ截图20160417221936.png" alt="wKioL1cTnG

2016-05-29 17:22:55 698

原创 复杂链表的复制

题目:一个链表的每个节点,有一个指向next指针指向先一个节点,还有一个random指针指向这个链表的一个随机节点或者NULL,现在要求实现复制这个复杂的链表,返回复制后的新链表。复杂链表的结构templatestruct ComplexNode{public: ComplexNode(const T& data) :_data(data) ,_next(NULL) ,_ran

2016-05-29 17:22:52 973

原创 面试题那些事(3)—栈

栈的定义--Stack栈只允许在末端进行插入和删除的线性表。栈具有后进先出的特性(LIFO,Last In First Out)。650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png")

2016-05-29 17:22:49 316

原创 c++智能指针的不断演化

RAII资源分配即初始化,定义一个类来封装资源的分配和释放,在构造 函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。 智能指针的引入:由于return ,throw等关键字的存在,导致顺序执行流的错乱,不断的进行跳转,使开辟的空间看似被释放,而实际上导致内存的泄露。例如以下两个例子:void Test1(){ int *p1 = new int(1);

2016-05-29 17:22:46 342

原创 面试题的那些事(2)—斐波那契数列

斐波那契数列1、写一个函数,输入n,求斐波那契数列的第n项。斐波纳挈数列的定义如下:650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/7E/81/wKiom1cCeQLD_FETAAAkmMx1hAg133.png" title="QQ截图20160329153517.png" alt="wKiom1cCeQLD_FETAAAkmM

2016-05-29 17:22:43 393

原创 面试题的那些事(1)

1、春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。测试样例:[1,2,3,2,2]  5返回:2解题思路:采用阵地攻守的思想: 第一个数字作为第一个士兵,守阵地;count = 1; 遇到相

2016-05-29 17:22:40 481

原创 函数模板在c++动态顺序表中的大作用

函数模板提供了一种机制通过它我们可以保留函数定义和函数调用的语义在一个程序位置上封装了一段代码确保在函数调用之前实参只被计算一次.函数模板提供一个种用来自动生成各种类型函数实例的算法程序员对于函数接口参数和返回类型中的全部或者部分类型进行参数化(parameterize)而函数体保持不变.函数模板使用注意事项:1、每个函数模板前边都需要添加模板声明例如:template2、在模板类的使用时,注意其

2016-05-29 17:22:37 447

原创 c++实现双向链表的常用功能

//结构体的定义struct Node{ Node(const DataType& d) :_next(NULL) ,_prev(NULL) ,_data(d) {}public: DataType _data; Node* _prev; Node* _next;};//双向链表类的定义class DouList{ friend ostream& operat

2016-05-29 17:22:34 407

原创 c/c++单链表面试题—链表相交问题

1、判断两个单链表是不是相交思路分析:最简单直接的方法就是依次遍历两条链表,判断其尾节点是不是相等,相等则相交否则不相交。bool CheckCross(const List& list1, const List& list2)//list1,list2为两个对象{ Node* l1 = list1._head; Node* l2 = list2._head; while (l1->_ne

2016-05-29 17:22:31 353

原创 c/c++单链表面试题—链表带环问题

1、判断一个单链表是否带环思路解析:判断一个单链表是不是带环,就看在遍历单链表的时候能不能遍历完成,如果带环的话会陷入死循环程序一直无法结束,但是这种判断方法在程序的实现是不可能的。所以转换一种思路,利用两个遍历速度不同的指针遍历,如果存在环的话,那么快指针迟早会追上慢指针。通过这个判断程序实现起来是比较简单可行的。单链表的结构体及其类的定义struct Node{public: Node(

2016-05-29 17:22:29 451

原创 c++中string类的基本功能的实现(1)

1、传统的实现string类的方法优点:程序简单易懂缺点:1)在实现其拷贝构造和赋值的操作时多次的调用new动态的开辟空间,因此也需要多次的通过delete来释放空间。如果处理不当还容易造成内存泄漏。2)程序的一致性比较差#include #include using namespace std;class String {public: // 构造函数 String(char *

2016-05-29 17:22:26 449

原创 C语言注释转换为c++的注释

问题要求:将C语言的注释转换为c++的注释方式常见的C语言注释问题,由此可见C语言的注释比较复杂,情况也比较多,如果按照以下的情况一种一种的去处理的话逻辑太过混乱,无法真正的整理清楚,所以需要转换思路。将复杂的控制逻辑分解成有限个稳定状态,在每个状态上进处理,这就是有限状态机。有限状态机是闭环系统,可以有限的状态,处理无穷的事务。650) this.width=650;" src="http://

2016-05-29 17:22:23 422

原创 C语言常见单链表面试题(2)

问题定义:      写一个函数Merge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,Merge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。比如:这里有两个链表,分别是list1: 5->10->15list2: 2->3->20Merge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->

2016-05-29 17:22:20 510

原创 C语言常见单链表面试题(1)

1、删除单链表的非尾节点解题思路:按照一般的思路单链表删除节点是必须知道其前驱节点才能删除,而在本题中不知道前驱节点,所以转换思路,先将需要删除的节点跟其后继节点的数据域交换,然后再删除既可。void EraseNotTail(pLinkNode pos){    assert(pos); pLinkNode del = NULL;//删除的节点 del = pos->next; pos

2016-05-29 17:22:17 435

原创 回调函数实现冒泡法的多种排序

#define _CRT_SECURE_NO_WARNINGS#include #include #include #include typedef struct//定义学生结构体{ char name[20]; char number[20]; int score;}Student;int struct_cmp(const void *elem1, const void

2016-05-29 17:22:14 487

原创 memcpy函数和memmove函数的模拟实现与区别

1、内存复制函数memcpy的模拟实现void * my_memcpy(void * buf1, const void * buf2, int count)//内存复制函数{ assert(buf1); assert(buf2);//断言 char * dest = (char *)buf1; char * src = (char *)buf2;//强制类型转换为char*,便于复制

2016-05-29 17:22:11 415

空空如也

空空如也

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

TA关注的人

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