- 博客(34)
- 收藏
- 关注
原创 HTTP详解
HTTP报文结构HTTP的两种报文:请求报文:client向server发送请求报文响应报文:从server到client的应答因为HTTP是面向文本的,因此 报文中的每个字段都是ASCII码串,故而每个字段的长度不确定。如上图所示:两种报文都是由三部分组成,两种报文格式的区别就是 开始行的不同。开始行:用于区分是请求报文还是响应报文。在请求报文的开始行叫做请求行(Requesr-L...
2019-11-08 13:15:19 354
原创 LT模式和ET模式区别
LT模式:电平触发当epoll_wait检测到文件描述符上有事件发生,并将此事件通知应用程序之后,应用程序可以不立即处理该事件,当下次调用epoll_wait时,还会向应用程序通知这个事件,直到此事件被处理。如果用户没有处理就绪的文件描述符或者没有处理完,则内核会再次提醒ET模式:边沿触发 (高效模式)当epoll_wait检测到文件描述符上有事件发生,并将此事件通知应用程序之后,...
2019-08-23 16:21:50 1688
原创 I/O复用 —— 详解epoll 及三种复用函数的比较
epoll是Linux特有的I/O复用函数。在实现上与select、poll有很大差异。它是使用一组函数来完成任务。epoll将用户关注的文件描述符上的事件放在内核里的一个事件表中,从而无须像select和poll那样每次调用都要重复传入文件描述符集或事件集。epoll_create#include<sys/epoll.h>int epoll_create(int si...
2019-08-23 15:35:26 256
原创 I/O复用 —— poll
poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪这poll的原型:#include<poll.h>int poll(struct pollfd* fds,nfds_t nfds,int timeout);fds参数是一个pollfd结构类型的数组它指定所有我们感兴趣的文件描述符上发生的可读、可写和异常等事件,定义如下:...
2019-08-23 14:37:32 244
原创 I/O复用 —— select
作者前言:在学习i/o复用前,我们要清楚为什么要引出I/O复用,它的的作用是什么?什么是I/O复用?I/O复用是怎么实现的? ------- 想一想噢~下面我来解释一下这些问题I/O复用的作用 从进程线程的学习,到多进程多线程,再到进程池线程池,我们处理事件的效率越来越高,但是却有一个问题,一直都没有解决,那就是,当服务器分配了一个线程或进程为某一个客户端服务时,该进程...
2019-08-23 10:19:37 256
原创 求一个有序数组中两个值相加为k的数字,返回这两个数字的下标。(腾讯面试题)
题目要求:求一个有序数组中两个值相加为k的数字,返回这两个数字的下标。找到返回正常的下标,查找失败返回-1分析:有序的数组(假设非降序),采取双向遍历,一个从前往后,一个从后往前,当前数字相加如果相等则返回,如果小于k则前面的继续往后,如果大于k则后面的继续往前typedef struct Pairs{ int x;//第一个数的下标 int y;//第二个数的下标}P...
2019-08-21 17:31:33 594
原创 字符串替换详解
字符串替换 1.一个换一个 函数将字符串中的字符'*'移到字符串的前部分,前面的非'*' 字符后移,但不能改变非'*'字符的先后顺序,函数返回串中非'*'字符的数量。(要求尽可能的占用少的时间和辅助空间)。 例如:原始串为au**toc**h**i*ps,处理后为*******autochips,函数返回9. 2.一个换多个(插入) ...
2019-08-21 14:49:00 1187
原创 实现一个命令解析器
(1)从键盘获取要执行的命令和参数,解析命令。用strtok(2)命令解析器fork复制自身,在子进程中替换为要执行的命令 execv(3)执行wait等待子进程结束execv而不用execl命令实现:(1)内置命令 cd ---> chdir exit(2)普通命令 pwd ls cp vi vim gcc未完。。。...
2019-08-08 15:37:48 1095
原创 c++支持的四种类型强转
首先我们来了解一下c语言中的类型强转#include<stdio.h>int main(){ int *p = NULL; char *q = NULL; q = p; return 0;}不能直接转换,需要强转#include<stdio.h>int main(){ int *p = NUL...
2019-08-03 14:27:30 473
原创 【linux】 Daemon守护进程
一,守护进程Linux Daemon(守护进程)守护进程也称精灵进程(daemon)是生存期较长的一种进程。它们常常在系统自 举时启动,仅在系统关闭时才终止。并且它们没有控制终端,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通...
2019-08-02 20:36:05 318
原创 【C++】继承、虚函数
我们要清楚继承的应用场景,为什么会引出继承的概念?1.要创建的新类与已有的类类似,只是多出几个成员变量或者成员函数2.当要创建多个类,它们拥有很多类似的成员变量或者成员函数时,可以把这些类共同的成员提取出来,定义一个基类,然后由基类继承。继承的本质含义就是代码的复用,派生类可以继承除基类构造,析构函数以外其他 所有的成员,为派生类所用,派生类只需要实现自己特有的成员即可两个...
2019-07-31 21:09:08 795
原创 TCP三次握手和四次挥手的过程详解
传输层协议主要有两个:TCP协议和UDP协议。这次主要讲解TCP协议使用TCP协议通信的双方必须写建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接时全双工的,即双方的数据度邪恶可以通过一个连接进行。完成数据交换后,通信双方都必须断开连接以释放系统资源。发送端执行的写操作和接收端执行的读操作次数之间没有任何数量关系。因为缓...
2019-07-30 19:55:13 1001 1
原创 有关printf输出08x格式详解
有关printf("%08x",number)详解先来看道题----选自程序员面试宝典下面程序的输出结果是多少?#include<stdio.h>int main(){ unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char* b = (char*)&a; pri...
2019-07-30 15:08:21 10682
原创 【Linux】fork() 和 vfor()
1.forkfork:创建一个和当前进程映像一样的进程就可以通过fork()系统调用。其定义如下:#include<sys/types.h>#include<unistd.h>pid_t fork(void);成功调用fork()会创建一个新的进程,它几乎与调用fork()的进程一模一样,这两个进程都会继续进行。划重点!!!fork函数每调用一...
2019-07-29 19:29:47 216
原创 this指针
隐含的this指针 每个类成员函数都含有一个指向被调用对象的指针,这个指针被称为this。在非const成员函数中,它的类型是指向该类类型的指针:在const成员函数中,是指向const类类型的指针。而在volatile成员函数中,是指向volatile类类型的指针。 1 改变类成员函数的定义 用额外的参数 this 指针 来定义每个成员函数 例...
2019-07-28 14:35:02 176
原创 【C++】STL迭代器
作者前言:学习迭代器之前,我们要先清楚,什么是迭代器?迭代器是干什么用的?为什么要使用迭代器?迭代器是一个支持指针类型抽象的类对象。提供了一种一般化的方法,对顺序或关联容器类型中的每个元素进行连续访问。简单来说,迭代器就是用来遍历容器的工具,并可以对容器进行一定的操作。划重点!!!迭代器和指针有什么区别?迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通...
2019-07-28 12:18:50 325 2
原创 【c++】String类的写时拷贝
在学习写时拷贝前,我们先看一个例子class String{public: String(char* ptr) { mptr = new char[strlen(ptr) + 1](); //+'\0' strcpy_s(mptr, strlen(ptr) + 1, ptr); } ~String() { delete[] mptr; mptr = NULL;...
2019-07-28 00:59:45 287
原创 【c++】typename关键字的使用
1.定义模板类型参数在c++模板中有两种定义方法:template<class T>...template<typename T>...这两种定义方式有什么区别呢?相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为:template<classT>......在这里c...
2019-07-27 20:28:22 325
原创 引用与指针的比较
引用是 C++中的概念,我们很容易把引用和指针混淆一起。一个程序中,n 是 m 的 一个引用(reference),m 是被引用物(referent)。 int m; int &n = m;n 相当于 m 的别名(绰号),对 n 的任何操作就是对 m 的操作。例如有人名叫王小 毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。...
2019-07-26 21:06:59 478 4
原创 字节对齐
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。举例说明:1.struct A{ char a;//1+3 int b;//4};如图所示:2.struct B { char b;//1+...
2019-07-23 20:53:07 137
原创 static关键字的作用
1.全局静态变量在全局变量前加上关键字static,全局变量就定义为一个全局静态变量。静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。作用域:全局静态变量在声明他的文件之外是不可见的,只能在本文件中使用,准确的说是从定义之处开始,到文件结尾。 例如在a.c中定义了s...
2019-07-23 16:51:31 236
原创 折半查找
折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找...
2019-07-23 16:04:09 311
原创 变量,函数内存分布---虚拟地址空间布局
int a = 10; //全局变量,全局区。全局变量初始化且初始化不为0,存放在内存的.data段 int m; // 全局变量初始化为0或者未初始化,存放在.bss段 class SomeClass { private: int b; //由使用决定,在main函数中类SomeClass动态分配,...
2019-03-21 22:27:40 421
原创 辨析*p++、(*p)++、*(p++) ......
int a[3]={1,2,3};int *p = a;*p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1;cout << *p++; // 结果为 1cout <<(*p++); // 1(*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2)cout << (*p)++; // 1...
2019-03-21 22:20:32 986
原创 【Linux】gdb调试总结
进入调试:(1)输入GDB <文件名>(2)输入GDB ----> file <文件名>l :显示源代码(默认显示main函数所在文件的源代码)list <文件名>:num 显示指定文件指定行附近的源代码b : breakpoint的简写,设置断点。b <行号> 给指定行添加断点b <函数名>...
2019-01-20 20:24:36 273
原创 【c++基础】类和对象 四个默认函数
1.构造函数:初始化对象所占内存空间(成员变量) 函数名与类名相等,不需要返回值 字符串赋值:需要开辟内存空间 mname = new char [strlen(name) + 1]();//对象在栈上开辟(由系统开辟和释放),而对象中的内容在堆上开辟。堆内存由用户 开辟和释放 strcpy(mname,name); 1.this指针:指向对象所占的内存...
2019-01-19 18:55:41 389
原创 【Linux基础】关于gcc的使用
在Linux 下使用gcc来编译程序时,只需使用:(假设源代码文件的文件名为main.c)gcc main.c./a.out然而该过程可分解为四步:预处理、编译、汇编、链接。1.预处理:gcc -E main.c -o main.i 生成 .i 文件 删除注释,处理预处理指令,将包含的头文件展开2.编译:gcc -S mai...
2018-11-10 16:08:09 417
原创 Typedef和#define的区别
Typedef 本身是一种存储类的关键字,在计算机编程语言中用来为复杂的声明定义简单的别名。Typedef 的含义:找到你所要声明的通用格式。例如这里申明 inta[4],b[4],c[4],只有a,b,c不同,但是他们有相同的申明模式 int<名字>[4]; 用你想要申明的新类型名代替通用格式中的变化部分。例如这里就是用新类型int_array代替a,b,c所在的位置...
2018-09-21 23:34:58 154
原创 递归算法
递归是指在函数的定义中使用函数自身的方法,其实递归就包含了两个意思:递和归,这就是递归的思想。在数学上理解递归就用一个函数来表示,如下图所示用一个简单代码来实现一下递归算法。这是一个简单的阶乘用递归算法实现。当然也可以用非递归的方法实现。两个的结果显然是一样的第二个是一个循环实现阶乘,这两个的原理其实是差不多的,递归是重复试用子函数来实现功能,而非递归就是用循环来实现这个功能。递归可以让代码看起来...
2018-06-20 21:46:21 281
原创 【题目分析】---- 逆序
给一个不多于5位数的正整数,要求:1.求出它是几位数2.分别输出每一位数字3.按逆序输出各位数字,例如原数为321,应输出123判断一个整数是几位数unsigned char GetFigures(int n){unsigned char figures = 0;while(n!=0){n /= 10;figures++;}return figures;...
2018-06-20 21:29:26 312
原创 visual studio调试
在编写代码时,利用调试可以查看程序在运行时,内部的状态,如变量值,代码运行的顺序,等。查程序的情况,可以更加清楚明确的分析所设计的算法。...
2018-05-30 22:00:04 201
原创 误差分析
由于计算机在存储十进制数时,先将该数值转换为二进制存储在内存中。读取时,又将二进制数转换为十进制数,在这个过程中就产生了数据误差。 float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不...
2018-05-07 14:36:57 349
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人