自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SGI-STL空间配置器

SGI-STL标准空间配置器 std::allocator是SGI定义的一个标准的配置器,只是把operator new 和 operator delete 做了层封装,不建议使用,主要因为效率不佳。 源码:SGI-STL特殊空间配置器 STL将内存配置与释放和对象的构造与析构分开实现:#include <stl_construct.h>construct(T1* p, cons

2017-08-16 22:00:27 494

原创 命令行参数的获取

时不时我们会遇到对命令含参数的处理,如果参数个数较多,按照顺序处理有可能会出现错误或者一些可选参数将不能实现,接下来介绍几个处理命令行参数的函数getopt#include <unistd.h>int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;//带值参

2017-08-11 17:19:05 976

原创 布隆过滤器

布隆过滤器 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(哈希表,Hash table)等数据结构都是这种思想。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也会越来越慢。 原理 Bloom Filter 是一种空间效率很高的随机数据结构,Bloom Filter 可以看做是对bit-map的扩展,它的

2017-08-08 20:28:42 918 1

原创 poll服务器

poll函数:int poll(struct pollfd *fds, nfds_t nfds, int timeout);参数: fds:存放需要被检测状态的Socket描述符;与select不同(select函数在调用之后,会清空检测socket描述符的数组),每当调用这个函数之后,系统不会清空这个数组,而是将有状态变化的描述符结构的revents变量状态变化,操作起来比较方便;nfd

2017-07-13 16:03:53 490

原创 进度条(shell)

C编写的进度条: http://blog.csdn.net/addw1/article/details/55292922shell编写#!/bin/bashfunction bar(){ i=0 bar='' lable=('|' '\\' '-' '/') index=0 while [ $i -le 100 ] do

2017-07-13 15:11:15 380

原创 eval

eval功能 告知shell取出eval的参数,然后按照参数特性来执行。参数数目不限,彼此用分号隔开。 区别: eval会对后面命令进行两次扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用, 则保证间接引用的语义。 `和$()两种替换方式都只对要替换的部分进行一次扫面 eval命令将会首先扫描命令行进行所有的置换,然后执行该命令,所以,eval适用

2017-07-10 20:53:24 879

原创 select/epoll服务器

select优点:高性能select一次等待多个文件描述符select的cpu压力低等待时间变短,提升了性能缺点:每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大select支持的文件描述符数量太小了,默认是1024//select.c#include<s

2017-06-30 17:59:27 384

翻译 线程池

诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入

2017-06-26 16:18:44 459

原创 UDP(用户数据报协议)和套接字编程

源端口:发送方的端口号(需要对方回信是选用,不用时可全为0)目的端口:终点交付报文时使用(把报文交给谁)UDP长度:UDP用户数据报的长度,最小值8(仅有首部)校验和:检测UDP用户数据报在传输中是否有错UDP特点无连接的尽最大努力交付,即不保证可靠交付面向报文的没有拥塞控制支持一对一、一对多、多对多的交互通信首部开销小,只有8个字节UDP套接字(不需要监听和连接)//serve

2017-06-26 15:10:02 721

原创 TCP套接字(server/client实现)

套接字概念:源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。分类: 流套接字(SOCK_STREAM)数据报套接字(SOCK_DGRAM)原始套接字(SOCK_RAW)TCP套接字(流套接字)TCP套接字工作流程: 首先,服务器端启动进程,调用Socket创建一个基于TCP协议的流套接字描述符。其次,服务进程调用bind命名套接

2017-06-23 16:44:34 1382

翻译 tcp定时器

TCP是一个面向连接的,可靠的,流式传输的协议。 为了维护安全和可靠,在TCP的里面有7种定时器:建立连接定时器(connection-establishment timer)重传定时器(retransmission timer)延迟应答定时器(delayed ACK timer)坚持定时器(persist timer)保活定时器(keepalive timer)FIN_WAIT_2

2017-06-20 17:32:48 295

原创 URG/PSH

URG(紧急位)急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)PSH(急迫位)在一个交互程序中,当客户发送一个命令给服务器时,它设置P U S H标志并停下来等待服务器的响

2017-06-20 17:19:57 380

翻译 NAT技术和代理服务器

NAT技术产生原因: NAT(Network Address Translation)网络地址转换,用于将访问Internet上公网的私有IP地址转换为合法的共有IP地址。产生原因:IPv4地址危机,由于其先天性不足,,在九十年代初期,已经预计到了IPv4地址不足,从而开始开发IPv6技术。但开发IPv6需要足够的时间,为了延长IPv4的使用时间,产生了NAT技术。定义: NAT网络地址

2017-06-13 11:20:55 543

原创 端口

端口简介我们知道,一台拥有IP地址的主机可以提供许多服 务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来 实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区 分不同的服务的。一个IP地址的端口 可以有65536个之多,端口是通过端口号来标记的,端口号只有整数,范围是从

2017-06-13 10:44:46 354

原创 ARP协议(地址解析协议)

ARP协议作用在通讯时,网络数据包首先是被网卡接收到再去向上一层一层处理,如果接收到的数据包的MAC地址与本机不符直接丢弃。因此在通讯之前必须获得目的主机的MAC地址,ARP协议就起到这个作用。ARP数据报格式帧类型:ARP(0806)硬件类型:链路层网络类型(以太网)协议类型:要转换的地址类型,(0x0800位IP地址)硬件地址长度:MAC地址长度(6)协议地址长度:IP地址长度(4)

2017-06-13 10:15:12 802

原创 循环冗余校验码(CRC)

CRC即循环冗余校验码(Cyclic Redundancy Check)是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余校验码(CRC)的基本原理在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而

2017-06-12 17:43:35 1494

原创 crond/crondtab

crondLinux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。Linux下的任务调度分配系统任务调度:系统周期性所要执行的工作,在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 用户任务调度:用

2017-06-09 16:59:57 781

原创 守护进程(Daemon)

守护进程(精灵进程):独立于控制终端,不能直接和用户交互,不受用户登录注销的影响的一种进程。守护进程特点: 独立于控制端(不受控制端的影响)自成进程组自成回话本身是孤儿进程(fork之后父进程退出),所以父进程为init(孤儿进程都被1号进程收养)守护进程通常采用d结尾,例如:Internet服务器inted;Web服务器httpd;acpid电源管理;sshd远程登录守护进程一些应用场

2017-06-07 17:49:48 436

原创 gdb调试多进程与多线程

gdb是Linux下的代码调试工具,在使用时要加 -g选项,开始:gdb file;退出:Ctrl+d或q。gdb调试多进程与多线程 默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。

2017-06-06 11:57:30 325

原创 map/multimap/set/multiset

根据数据在容器中的排列特性,分为序列式(sequeence)和关联式(associative)序列式容器:其中元素可序,但不一定有序,容器通过元素在容器中的位置顺序存储和访问元素 C++本身提供了一个序列式容器:数组(array); STL中提供了vector,list,slist,deque,stack,queue,heap,priority-queue 其中stack和queue只是

2017-05-30 11:38:30 537

原创 栈(stack)

栈(stack)是一个后进先出的线性表,只允许在栈顶插入和删除元素栈的结构栈的接口push() :入栈pop() : 出栈top() : 获取栈顶元素empty(): 判空size():栈中元素的个数Python中的列表(list)就类似一个栈,对应的接口实现: 栈的应用–括号匹配先创建一个栈,保存为匹配得左括号遍历字符串 如果是左括号入栈如果是右括号 此时如果栈空,右括号多

2017-05-26 22:14:56 507

原创 AVL树

AVL树诞生的原因 如果数据是有序的或者接近有序的,搜索二叉树就会产生单支的情况,单支就相当于在顺序表中搜索元素,降低了效率。因此1962年俄罗斯两位数学家发明了AVL树。AVL树 在二叉搜索树中插入新的结点后,保证每个结点的左右子树的高度之差的绝对值不超过1,就可以降低树的高的,减少平均搜索长度。 性质: - 左右子树都是AVL树 - 左右子树的高的之差为-1或0或1(

2017-05-22 15:27:12 314

原创 命令行参数

给main()函数传递两个参数,int argc和char* argv[]argc:表示命令行参数的个数,不许要用户传递,它会根据用户从命令行输入的参数个数,自动确定argv[]:存储用户从命令行传递进来的参数,它的第一个成员是用户运行的程序名字,也可写为char** argv举栗子:#include <stdio.h>void main(int argc, char* argv[]){

2017-04-12 19:50:10 1104

原创 单链表(无头结点)

单链表:是一种链式存储的线性表,用一组任意的存储单元存放线性表的元素,称存储单元为一个节点。 单链表的结构:typedef int DataType;typedef struct Node{ DataType data; struct Node* pNext;}Node, *PNode, **PPNode; 单链表简单操作:void InitList(PPNode pHea

2017-04-11 20:51:33 828

原创 动态顺序表

动态顺序表结构:typedef int DataType;typedef struct SeqListD{ DataType* array;//数据指针 size_t capacity; //容量 size_t size; //有效元素的个数}SeqListD, *PSeqListD; 动态顺序表部分操作:#include"seqlist.h"void InitS

2017-04-11 20:36:49 293

原创 静态顺序表

静态顺序表:用一组地址连续的存储单元依次存储数据元素的线性结构 静态顺序表结构:#define MAX_SIZE 10typedef int Datatype;typedef struct SeqLists{ Datatype data[MAX_SIZE]; size_t size;}Seqlist, *PSeqlist;静态顺序表基本操作:#include<stdio.

2017-04-10 22:31:32 254

原创 可变参数(variable-argument)

可变参数列表通过宏来实现,这些宏定义在头文件#include< stdarg.h >中,包含一个类型va_list(vs中为char*),三个宏va_start,va_arg,va_end。声明一个va_list的变量和三个宏配合使用首先我们看一个简单的用可变参数写的求平均值的函数:#include<stdarg.h>int average(int value,...){ va_lis

2017-04-09 20:13:47 420

原创 STL-list

List使用双向链表来管理元素 使用list,必须包含#include< list >list是定义与namespace std中的templatelist不支持随机存取,所以也不提供下标操作符和at()任何位置上插入、删除元素都非常快插入、删除元素不会造成reference、pointers、iterators失效list不提供容量,空间重新分配等操作函数,每个元素都有自己的内存,在被删

2017-04-08 14:16:49 497

原创 STL-vector

vector模塑出一个动态数组,它本身是“将元素置于动态数组中加以管理”的一个抽象概念。(C++ Standard)并未要求必须以动态数组实现vector。 使用vector之前应该包含#include< vector>vector是定义与namespace std中的templatevector是一个有序群集vector支持随机存取vector的迭代器是随机存取迭代器(random acc

2017-04-07 19:27:35 416

原创 二维数组中查找指定数据

二维数组中查找指定数据数组中元素每行按照从左到右递增,每列从上到下递增bool Find(int* arr, int rows, int columns, int data){ bool found = false; if (arr != NULL && rows > 0 && columns > 0) { int row = 0; in

2017-04-05 22:22:28 951

原创 死锁

产生死锁的原因:因为系统资源不足进程运行推进的顺序不合适资源分配不当等 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的条件:互斥:一个资源每次只能被一个进程使用占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放非抢占:进程已获得的资源,在末使用完之前,

2017-03-31 21:43:21 432

原创 容器配接器(stacks)

stack(堆栈)的简单使用#include<iostream>#include<stack>using namespace std;int main(){ stack<int> st; stack<int> st1; st.push(1);//入栈 st.push(2); st.push(3); st1.push(1);//入栈 st1

2017-03-31 20:19:49 437

原创 从尾到头打印单链表

从尾到头打印单链表其实就是后进先出,而栈(stack)就是后进先出的,从而可以利用栈来实现逆序打印单链表//定义链表节点typedef struct ListNode{ int data; struct ListNode * next;}Node,*PNode,**PPNode;利用栈实现#include<iostream>#include<stack>//使用栈必须包含

2017-03-31 18:05:04 398

原创 C++异常处理

异常处理 事先分析程序运行时可能出现的各种意外情况,并且分别制定相应的处理方法异常处理的方法 C++异常机制组成:try(检查),throw(抛出),catch(捕捉) void Test(){ throw 1;}void Test1(){ try { Test(); } catch(int) {

2017-03-28 21:00:47 396

原创 命名空间

为什么需要命名空间? 引入命名空间,用来处理程序中常见的同名冲突什么是命名空间? 一个由程序设计者命名的内存区域 根据需要指定一些有名字(或无名)的空间区域,将一些全局实体放在里面,与其他全局实体分隔开 创建命名空间//有名的命名空间namespace ns//-->空间名{ //函数、类、结构体、模板、变量、常量}//无名的命名空间namespace{

2017-03-28 18:22:24 309

原创 命名管道(FIFO)

FIFOFIFO Concept管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信,在命名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名(pathname)与之关联,以FIFO的文件形式存储于文件系统中命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通

2017-03-24 17:25:26 621

原创 线程(Linux)

ThreadThread application scenario 有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程

2017-03-23 21:08:33 504

原创 赋值运算符函数

注意点返回值类型为该类型的引用,并且在函数结束时返回实例自身的引用(*this) 只有返回一个引用才允许连续赋值(链式访问)参数的类型声明为常量引用 1.如果传入的参数不是引用而是实例,那么从形参到实参会调用拷贝构造函数,降低代码效率。(传引用不需调用拷贝构造函数) 2.在函数体内不会改变传入的实例(引用前加const)释放实例自身已有的内存(防止内存泄漏)判断传入参数与当前实例是

2017-03-23 18:24:56 335

原创 管道(pipe)

管道管道概念 调用pipe函数在内核中开辟一段缓冲区称为管道 函数原型:int pipe(int filedes[2]) 返回值:成功–>0;失败–> -1 有一个读端(filedes[0])和一个写端(filedes[1]) 通过filedes参数传出给用户程序两个文件描述符 通过read和write函数读写内核缓冲区,进行通信

2017-03-19 22:36:20 501

原创 消息队列

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

2017-03-18 15:21:44 351

空空如也

空空如也

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

TA关注的人

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