自定义博客皮肤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)
  • 收藏
  • 关注

原创 myhttp

     HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。 实现一个服务器程序,支持HTTP协议的服务器,浏览器进行访问 从请求角度上,支持GET和POST方法;从相应角度上,支持静态页面也支持动态页面   静态页面:GET方法且query_string为空。                    根据url_path获取到文件的...

2018-08-06 13:11:44 651

原创 守护进程

守护进程也叫精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。Linux的大多数服务器就是用守护进程实现的,比如:ftp服务器,ssh服务器,web服务器等等。同时,守护进程完成许多系统任务。Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互,其他进程都是在用户登录或运行时创建,在运行结束或用户注销时终...

2018-06-06 15:06:34 174

原创 c++继承下

继承的方式主要分为单继承、多继承、菱形继承。普通单继承:指向派生类的基类指针或者引用,其类型仍然属于基类类型,而不是派生类类型#include<iostream>using namespace std;class Base{public: void fun() { cout << "Base->fun()" << endl; } ...

2018-05-14 21:29:55 223

原创 c、c++总结——动态内存管理

在介绍动态内存管理之前,让我先啰嗦几句关于内存的问题。经常写代码的同学都知道,内存我们主要分为三个:静态区、堆和栈静态区主要存储一些静态全局变量。静态区的内容在整个程序运行期间一直存在,在程序运行结束时销毁。由于它在程序运行之            前就已经明确,因此程序是没有办法对他进行修改的。栈又叫堆栈。它主要存储的是一些局部变量和函数形参。在函数运行结束后就立即被销毁。堆栈有一个显著的特点就...

2018-05-07 15:45:47 238

原创 进程间关系——进程组、作业、会话

进程组:每个进程除了有自己的进程ID之外,还属于一个进程组。进程组是一个进程之间的集合,由一个或多个进程组成。通常是为了共同完成某一项任务,所以相应的,同一进程组中的进程可以接受来自同一终端的各种信号。每个进程组有一个唯一的组ID,有一个进程组组长。作为进程组的组长,他有一个很明显的特征可以让我们认出他,那就是:进程组ID和进程 ID相同。函数getpgrp可以返回调用进程的进程组ID:#incl...

2018-04-26 11:21:14 207

原创 线程基础知识

线程概念:典型的进程可以看成只有一个控制序列:一个进程在某个时刻只能做一件事情。有了多个控制线程以后,在程序设计时就可以把进程设计成在某一个时刻能够不止做一件事,每个线程处理各自独立的任务。而这个控制序列我们就称它为“线程”。或者可以说,在一个程序里的一个执行路线叫做线程。一个进程至少有一个执行路线。说起线程,首先可能就会想到进程。那么,线程和进程究竟有什么关系呢?(1)进程是承担系统分配资源的基...

2018-04-07 11:55:45 264

原创 哈希表——线性探测、二次探测

线性表,二叉搜索树、AVL树、红黑树B树中,元素在存储结构中的位置与元素的关键码之间不存在直接的对应关系。在数据结构中搜索一个元素需要进行一系列的关键码比较。搜索的效率取决于搜索过程中比较的次数。理想的搜索方法是可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,使元素的存储位置与它的关键码之间建立一个确定的对应函数关系Hash(),那么每个元素关键码与结构中的一个唯一的存储...

2018-04-03 11:24:27 2566

原创 AVL树——左单旋、右单旋、左右双旋、右左双旋

本篇文章主要介绍AVL树的四种旋转方法。首先,右单旋:插入节点位于根节点的左子节点的左子树。void _RotateR(Node* parent) { Node* subL = parent->_left; Node* subLR = subL->_right; parent->_left = subLR; if (subLR) subLR->_p...

2018-04-03 11:06:41 2531 1

原创 信号——产生、处理、捕捉、接收、阻塞

一个信号是一条小消息,它通知系统进程中发生了一个某种类型的事件,提供了一种处理异步事件的方法。每一种信号都有一个名字,在头文件<signal.h>中,信号名都被定义为正整数常量。1~31号实时普通信号和34~64号实时信号每种信号类型都对应某种系统事件,低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程是不可见的。信号提供一种机制,通知用户进程发生了这些异常。那么信号是如...

2018-03-30 19:32:03 1105

原创 进程创建,进程终止

进程创建:fork函数:#include<unistd.h>pid_t fork(void);返回值:子进程返回0,父进程返回子进程的进程id,出错返回-1.fork之后,子进程是父进程的副本。子进程获得父进程数据空间、堆和栈的副本。值得注意的是,这是子进程所拥有的副本,父进程和子进程并不共享这些存储空间部分。也就是说,子进程对变量做出的改变并不影响父进程。 下面是一段关于...

2018-03-22 17:39:49 576

原创 简易shell

shell是指提供使用者使用界面的软件,它接收命令,然后调用相关的应用程序。shell的运行原理:       shell用fork建立新进程,用execv函数簇在新进程中运行用户指定的程序,最后shell用wait命令等待新进程结束。wait系统调用同时从内核取得退出状态或者信号序列以告知子进程是如何结束的。所以要写一个shell,需要循环以下过程: 1.获取命令行 2.解析命令行 3.建立一个...

2018-03-22 16:45:04 297

原创 简单计算器

makefile:main:main.o add.o sub.o mul.o gcc -o $@ $^add:add.c gcc -o $@ $^sub:sub.c gcc -o $@ $^mul:mul.c gcc -o $@ $^.PHONY:cleanclean: rm -f add sub mul...

2018-03-22 14:58:53 186

原创 task_struct、进程调度、僵尸进程、孤儿进程

这篇文章,我会就我的理解对PCB和进程调度做出我的看法。首先,进程,什么是进程?课本上的概念说,进进程是程序的一个执行实例,是一个正在执行中的程序。从内核的角度来说,进程是担当分配系统资源的实体。进程的信息被放在一个叫做进程控制块(PCB)的结构体中。这个结构体可以理解为进程属性的集合。linux称呼这个结构体叫做:task_struct。task_struct是Linux内核的一种数据结构。被装...

2018-03-22 14:10:29 295

原创 进程间通信——管道,消息队列,共享内存

进程间通信的本质是让两个不相干的进程看到同一份资源。这个资源是由操作系统提供的一个文件。进程间通信的目的:1.数据传输:一个进程需要将它 的数据发送给另一个进程。2.资源共享:多个进程之间共享同样的资源。3.通知事件:一个进程需要向另一个(组)进程发送消息,通知它们发生了某种事件。(进程终止时通知父进程)4.进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所...

2018-03-21 16:35:52 1471

原创 插入排序——直接插入排序、二分插入排序、希尔排序

选择排序是一种较为简单的排序算法。它的实现原理是每一次从待排序的数据元素中挑出一个最小(大)的元素,存放在数据的起始(末尾)位置,直到所有待排序的数据排完。直接插入排序:当插入第i个元素的时候,我们认为它前面的i个元素已序。这时候用array[i]的排序吗与前面的排序码进行比较,找到适合的位置就进行插入,原来位置上的元素按顺序向后移动。  时间复杂度:     最差:和

2018-01-24 21:56:36 329

原创 c++模拟实现vector

上一篇说到了list,这一篇我们来讨论讨论vectorvector和list都是STL中的常见容器。它是一种顺序容器,支持随机访问。和数极为相似,都是一块连续的内存空间。数组有的功能,它基本都能实现。和数组不同的地方在于:数组分配到的空间是死的,不可变的;而vector却可以随着元素的不断插入,它自己会进行增容。当程序员无法知道到底需要多大的空间的时候,这无疑是最好的方法,并且可以

2017-12-05 21:01:45 339

原创 模拟实现list

list是类库中的一个类,可以将其视为双向链表。使用它的好处是在任何位置增加或删除元素都很快缺点是不支持随机存取话不多说,直接上代码:代码后面都有注释,希望看完可以对你有帮助。#include#include#includeusing namespace std;#pragma oncetypedef int DataType;struct

2017-12-05 20:47:10 271

原创 栈和队列

/*#include#includeusing namespace std; templateclass Stack{private: T* _pdata; size_t _size; size_t _capacity;public: Stack() :_pdata(NULL) , _size(0) , _capacity(0) {} ~Stack

2017-11-20 23:02:43 149

原创 模板函数

对于一个简单的加法运算来说,我们给出它的代码:int add(int m, int n){ return m + n;}但是现在情况再复杂一些,我们现在要计算浮点类型的加法,我们又要重新写一个代码:float add(float m, float n){ return m + n;}很明显,整型加法和浮点型的加法只有参数类型和返回值类型有区别。这时候,我们不妨大胆的给出一个函数,它既能

2017-11-20 20:58:26 266

原创 Linux基本命令

ls: 功能:目录下 ,列出所有子目录与文件;文件下,列出所有文件名和其他信息。常用的选项:-a:列出目录下所有文件,包括开头的隐含文件-d:将目录像文件一样显示,而不是显示其下的文件。如:ls-d制定目录。-i:输出文件的i节点的索引信息。如:ls-ai指定文件-k:以k节点的形式表示文件的大小。如:ls-alk指定文件-l:列出文件的详细信息。-n:用数字的UID,

2017-11-18 21:18:01 192

原创 c++常见练习题下

//输出水仙花数int main(){ int i = 0; int j = 0; int k = 0; for (int m = 100; m < 1000; m++) { i = m % 10; j = m /10 % 10; k = m / 100; if (i*i*i + j*j*j + k*k*k == m) printf("%d ", m); }

2017-11-12 19:50:28 172

原创 链表相关练习题

#include#include#includeusing namespace std;typedef struct Node{ Node* _pNext; int _data;}*PNode;//初始化链表void InitList(PNode* pHead){ assert(pHead); *pHead = NULL;}//查找单链表的中间节点,只能遍历

2017-11-12 19:35:16 224

原创 目标文件里有什么——揭秘目标文件

程序源代码被编译后生成的机器指令被放在代码段(.text);全局变量和局部静态变量被放在数据段( .data );除此之外还有程序里边的只读变量(如const修饰的变量)和字符串常量被分配在只读数据段( .rodata ),注释信息段( .comment ),堆栈提示段(.nute.GNU-stack)。未初始化的全局变量和静态局部变量的默认值都是0,为他们在数据段分配空间是不必要的,所以

2017-11-11 14:47:23 332

原创 程序执行期间发生了哪些事——预处理,编译,汇编,链接

当我们运行一个程序时,究竟发生了什么,这篇博客,我将就我的了解做出分析。预处理:(1)将所有的"#define"删除,展开宏定义。(2)处理条件预编译指令,如:"#if" "ifdef"  "endif" (3)将被包含的文件插入到"#include"预编译指令中(4)删除注释(5)添加行号,以便编译器产生调试用的行号和用于编译产生错误时的警告的行号(6)保留所有的#p

2017-11-07 09:44:35 607

原创 递归和非递归方法求斐波那契数

递归方法求斐波那契数int fun(int n){ int num = 0; if (n <= 2) { num = 1; return num; } else return fun(n - 1) + fun(n -2);}int main(){ int n = 30; for (int i = 1; i <=n; i++) { printf("%d

2017-11-04 20:35:25 680

原创 库函数strcpy,strcat,strcmp,shrlen的实现

char* mystrcpy(char* str, const char* ptr){ char* ret = str; assert(str); assert(ptr); while ((*str++= *ptr++) && ptr != '\0') { ; } return ret;}char* mystrcat(char* str, const char* ptr)

2017-11-04 16:32:24 222

原创 结构体及位段

结构体:结构体是一些不同数据类型组成的的集合。结构体的定义:struct { char name; int age; char sex; int phonenum[15];}student1;这是一个简单的结构体。这个声明创建了一个交student的变量,它包含三个成员:姓名,年龄,性别,手机号码。结构成员的直接访问: 结构变量的成员是通过点操作

2017-11-03 16:45:18 347

原创 冒泡排序,选择排序,二分查找小结

我们知道,排序方法很多:冒泡排序,选择排序,快速排序,希尔排序。今天,我将就我的了解来作出介绍:冒泡排序:冒泡排序是一种较为简单的排序方法,它主要思路是遍历所有的数据,一次比较两个数,如果它们的顺序是我们所要求的,就不变化;如果它们的大小顺序和我们的要求相左,则进行交换。重复遍历,直到没有数据需要交换,也就是所有的数据都按照我们的期待的顺序排列,即冒泡排序成功。下面举一个简单的例子,假

2017-11-01 09:50:45 475

原创 简单的顺序表中的一些函数以及一些简单的测试

编译环境是vs2012#include#include#includeusing namespace std;/*struct Seqlist{ int *_array; size_t _size; size_t _capacity;};void InitSeqlist(Seqlist * q){ assert(q); q->_array = new int[3];

2017-10-30 20:28:43 241

原创 c语言常见练习题

c语言的常见练习题,只有多练习,代码能力才会进步。

2017-10-23 22:33:11 745 1

原创 c++继承上

一.继承的介绍继承是面向对象的一个重要特性。继承可以在已有类的基础上创建新的类,新类可以从一个或多个已有类中继承数据成员和成员函数,并且可以重新定义新的成员函数和数据成员,称已有类为父类,在它基础上建立的新类为派生类。class student{private:int s1;}class mystudent:public student{private:int s2;}

2017-10-07 18:05:33 211

原创 c++之初体验——函数重载,引用,命名空间

初学c++,我们首先要了解的是c++和之前所学习的c的区别。作为面向过程和面向对象两个不同的编程语言,在很多方面它们都是类似的,但是也有一些不同。这篇文章,我会就我的理解作出一些说明。1.返回值。c++和c第一个不同之处在于返回值的不同,在C里,如果一个函数没有指定返回值类型,那么他返回的是一个int型,而C++里,同样的情况下返回值必须要指定为void型,否则编译不会通过(此处测试软件为VS

2017-09-07 21:27:41 529

原创 c++开篇——自引用指针this

c++中,有一个特别的指针this,也叫自引用指针。这个指针的巧妙之处在于它永远指向的是当前对象,由此便可以访问当前对象的所有成员。这样一来许多问题就得到了巧妙的解决。注意,this 是一个指针,要用->来访问成员变量或成员函数。当调用到printpoint函数时,通过对象来访问成员,此处this指针接受对象传来的地址。关于this指针,有以下几点需做说明:1.

2017-03-13 18:19:21 865

原创 预处理指令和宏

1.预定义指令:_FILE_  //进行编译的源文件_LINE_  //文件当前的行号_DATE_ // 文件被编译的日期_TIME_  //文件被编译的时间_STDC_  //如果编译器遵循ANSI C,其值为1,否则未定义。这样可以输出当前编译文件的相关信息2.宏和函数的区别:(1)宏允许把参数替换到文本中。宏参数和#define定义可以包含其他#define定

2016-11-06 18:34:09 236

空空如也

空空如也

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

TA关注的人

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