自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WCLEndless的博客

学海无涯!

  • 博客(37)
  • 收藏
  • 关注

原创 DNS域名解析全过程

转载 :https://blog.csdn.net/m0_37812513/article/details/78775629关于dns域名解析大致过程如图:当一个用户在地址栏输入www.taobao.com时,DNS解析有大致十个过程,如下:1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统.

2021-03-02 19:44:16 284

原创 windows监控所有应用程序崩溃,生成dump文件控制

windows监控所有应用程序崩溃,生成dump文件控制,配置上生成dump文件地址,如下图设置:c:\CrashDump

2021-02-23 10:38:06 617

原创 scrapy框架中多个spider,tiems,pipelines的使用及运行方法

用scrapy只创建一个项目,创建多个spider,每个spider指定items,pipelines.启动爬虫时只写一个启动脚本就可以全部同时启动。本文代码已上传至github,链接在文未。一,创建多个spider的scrapy项目scrapy startproject mymultispidercd mymultispiderscrapy genspider myspd1 sina.com.cnscrapy genspider myspd2 sina.com.cnscrapy...

2020-10-29 18:10:55 1517

原创 Qt多进程共享内存

 Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。  先说下实现共享内存的步骤,然后用一具体的实例说明。  (一)向共享内存中提供数据的一方:  1,定义QSharedMemory shareMemory,并设置标志名shareMemory.setKey(),例如shareMemory.setKey("shareimg");  2,将共享内存与主进程分离shareMemory.detach();  3,创建共享内存shareM...

2020-10-16 10:29:43 1245

转载 简单工厂模式、工厂方法模式与抽象工厂模式

1. 简单工厂模式1. 1 简单工厂模式的定义简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的“消费”和生产完全分开,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。1.2 简单工厂模式的构成具体的工厂角色:Factory;在工厂中可以调用方法生产出具体的某个类型的产品; 抽象的产品角色.

2020-09-23 09:44:21 194

转载 Qt5 事件(event)机制详解

1.简述个人认为,事件机制是Qt最难以理解且最为精妙的一部分。事件主要分为两种:在与用户交互时发生。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。 系统自动发生,比如计时器事件(timerEvent)等。在发生事件时(比如说上面说的按下鼠标),就会产生一个QEvent对象(这里是QMouseEvent,为QEvent的子类),这个QEvent对象会传给当前组件的event函数。如果当前组件没有安装事件过滤器(这个下文会提到),则会被event函数...

2020-09-17 12:37:59 2376 3

原创 装饰者模式

装饰者模式:动态的给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。UML图:装饰者.png一般来说装饰者模式有下面几个参与者:Component:装饰者和被装饰者共同的父类,是一个接口或者抽象类,用来定义基本行为 ConcreteComponent:定义具体对象,即被装饰者 Decorator:抽象装饰者,继承自Component,从外类来扩展ConcreteComponent。对于ConcreteComponent来说,不需要知道Decorator的存在.

2020-08-13 14:29:50 120

原创 三种继承方式的区别与联系

#include<iostream>using namespace std;class Base{public: void fun_1(){}protected: void fun_2(){}private: int x_;};class Derived :private Base{public: void fun_3() ...

2018-08-03 16:03:40 2145

转载 虚函数与虚函数表剖析(动多态)

探索C++虚函数在g++中的实现本文是我在追查一个诡异core问题的过程中收获的一点心得,把公司项目相关的背景和特定条件去掉后,仅取其中通用的C++虚函数实现部分知识记录于此。在开始之前,原谅我先借用一张图黑一下C++:“无敌”的C++如果你也在写C++,请一定小心…至少,你要先有所了解: 当你在写虚函数的时候,g++在写什么?先写个例子为了探索C++虚函数的实现,我们...

2018-08-03 15:47:21 300

原创 vld内存泄露工具使用

 内存泄露工具测试,如果想要将内存泄露信息打印在控制台,操作方法如下:      项目->属性->生成事件->后生成事件->命令行:editbin /subsystem:console $(OutDir)$(ProjectName).exe      如果想要将内存泄露信息保存到一个文件中,将vld(内存泄露工具)安装目录下vld.ini配置文件中的      Rep...

2018-08-03 10:17:49 560

原创 epoll源码剖析

asmlinkage long sys_epoll_create(int size)功能概要:1、在执行sys_epoll_create之前会有个初始化工作,它挂在了一个文件系统“eventpollfs”,然后create就是在这个文件系统下分配一个fd给用户该函数构造相应的数据结构,file,inode,以及分配fd2、开辟一个eventpoll结构,并且将fd对应的file

2017-08-02 20:16:47 317

原创 poll源码剖析

asmlinkage long sys_poll(struct pollfd __user * ufds, unsigned int nfds, long timeout)这个函数的功能如下:1、首先将用户传进来的参数拷贝进内核,内核是以poll_list的形式组织用户传进来的pollfd指针数组,pollfd定义和poll_list定义如下:struct poll_list { s

2017-08-02 16:58:01 603

原创 select源码剖析

asmlinkage longsys_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp)select是个系统调用,他进入内核态之后就调用sys_select(),这个函数的功能有以下几点:1、参数检查,对n进行判断,n的最大值就是当前

2017-08-02 15:56:13 1579

原创 进程的调用和进程切换

进程调用的时机自愿调度:用户进程自愿发生调度,如用户进程调用wait4()和exit()时,内核进程 调用schedule()函数发生调度(schedule()只有内核线程才能调用)。非自愿调度:当发生中断或者系统调用时,从系统空间返回到用户空间时,检查进程的task_struct结构的need_resched变量是否为1,,为1就需要调度,否则就不需要调度(所以可是说从系统空间返回到用户

2017-07-25 16:43:13 1726

原创 execve系统调用

sys_execve()在真正的开始执行系统调用函数之前,系统调用服务程序已经将一些系统调用的函数的参数传递给了相应的寄存器,比如这里的ebx,ecx,edx都分别保存了系统调用的参数,ebx保存的是第一个参数,依次类推(当然最多传递的参数个数不能大于5个),首先这个函数通过ebx获取需要执行的文件的绝对路径,他通过这样一个函数实现获取到文件名之后他就会调用do_execve();

2017-07-23 19:41:36 2710

原创 malloc与free

glibc的alloctor--ptmallocptmalloc这个内存分配器实现了malloc()和free()等函数,ptmalloc把各个不同大小的内存块以chunk这样的数据结构的形式用双向链表串起来,一个链表就是一个bin,ptmalloc共有128个bin,分为fast bins 、unsorted bins、small bins 、large bins ,当用户通过malloc申

2017-07-16 00:35:26 292

原创 fork源码概要分析

fork属于系统调用,首先从用户态切换到内核态,这个过程前面已经说过了,到了内核态之后就是调用sys_fork(),然后调用do_fork():asmlinkage int sys_fork(struct pt_regs regs){ return do_fork(SIGCHLD, regs.esp, &regs, 0, NULL, NULL);}这个过程会传递一些信号值和寄存器进去

2017-07-09 17:53:13 510 2

原创 系统调用的详细过程

用户态:首先先找到系统调用号,我们来看unistd.h头文件中这样一段代码:#define __NR_restart_syscall 0#define __NR_exit 1#define __NR_fork 2#define __NR_read 3#define __NR_write 4#define __NR_open 5#defin

2017-07-09 17:39:28 4077 2

原创 【剖析】0-1背包算法

【剖析】0-1背包算法

2017-06-21 15:53:15 438

原创 【详解】平面中最接近点对问题

【详解】平面中最接近点对问题

2017-06-21 11:11:00 1517

原创 【详解】平面中最接近点对问题

数组当中的最接近点对问题详解在一个一维数组当中要找出两个值相减得到的差值最小,当然有的人会说这个很简单,只要将数组当中的值两两相减,然后对最后的结果找一个最小值就可以了,这种方法想必是可以,这就是所谓的暴力解法,时间复杂度是非常大的。 我们这里我介绍一种时间复杂度比较低的算法,我们利用分治的策略,将大规模的问题缩小化,首先我们将数组平分一半,左边的数值均小于右边的数值,但是左边和右边分别是乱序的,

2017-06-03 22:13:28 4587

转载 TCP和UDP详解

什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。 UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。 使用TCP还是UDP,那要看你的程序注重哪一个方面,可靠(tcp)还是快速(udp)。 1.TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的

2017-05-24 17:18:30 375

原创 B树的插入、删除与遍历

B树的插入定义: 1、根节点至少有两个分支 2、除了根节点以外,所有节点的关键字个数至少为M/2个,最多为M-1 3、每个节点的度数均是关键字数加一 4、所有的叶子节点都在同一层 插入: 我们设计节点的结构如下:#define M 5#define MAX M - 1#define MIN M/2typedef char KeyType;typedef struct {}Rec

2017-04-29 20:45:04 1493 4

原创 高度平衡二叉搜索树(AVL)的插入与删除

avl树的插入平衡二叉树:要么是空树,要么是左右子树的高度差不超过一,并且左右子树又分别为平衡二叉树。 而AVL树插入就需要对二叉树的平衡性做调整,使之即平衡又是有序的,这里就会需要左旋转、右旋转、和左右双旋转。并且调节相应的平衡因子,平衡因子等于右子树高度减去左子树高度。 AVLTreeNOde:struct AVLNode { AVLNode *leftchild;

2017-04-19 17:31:54 426

原创 二叉搜索树的插入、删除与遍历

二叉搜索树的插入二叉搜索树是有序的,插入之后要使插入后的树还是有序的,就必须比较每个节点的值,然后再选择合适的位置插入,首先先将树的节点设计如下:typedef int Elemtype;typedef struct _BstNode{ Elemtype data; _BstNode * leftchild; _BstNode * rightchild; _Bst

2017-04-12 14:01:37 285 4

原创 【详解】前、中、后序线索化二叉树及其遍历

前序线索化二叉树前序线索化二叉树是在二叉树前序遍历的过程中对其进行线索化,将叶子节点和单分支节点的指针域线索化成其前驱和后继,利用递归的特点,并且定义两个节点指针,一个在前一个在后,在中序遍历的过程中通过这两个前后指针建立前驱后继的连接关系。 实现代码://前序线索化二叉树void PreThBinaryTree(BtThNode*root, BtThNode *&p){ if (ro

2017-04-10 11:26:12 3351 4

原创 完全、平衡二叉树的判断与树拷贝、子树判断

完全二叉树的判断完全二叉树的n-1层是一颗满二叉树,最后一层的节点依次从左到右。所以只要n-1层第一次出现只有一个左孩子没有有孩子的情况或者没有左孩子的情况就做一个标记,往后的遍历的过程中如果还出现了有节点有孩子的情况就可以判断出此树非完全二叉树,否则就是完全二叉树。 代码实现如下:bool IsCompBinaryTree(BtNode *p){ if (p == NULL)

2017-04-09 15:15:49 472

原创 二叉树的一些基本操作

二叉树的创建:二叉树创建的方式有很多种,可以根据先根遍历的序列和中根遍历的序列对二叉树进行创建,也可以给一个特定的先序序列对二叉树进行创建。用先根序列和中根序列创建二叉树,就是先根序列的第一个元素一定是树的根节点,然后再中根序列中找到这个根节点所在的位置,此位置的左边便是此树的左子树的中根遍历的序列,右边便是此树的右子树的中根遍历序列,用递归的思想就可以很简单的完成此树的创建,代码如下:BtNode

2017-04-04 21:36:06 237

原创 程序的调用机制及目标文件有什么

1、一个程序的成功执行,需要经过层层的调用才能让计算机相应的硬件执行相应的功能,让cpu执行计算,让内存存储信息等等,软件是依赖与硬件,硬件没有了软件的控制也就没有了灵魂,那么一个应用程序的运行底层到底是怎样调用的呢?它划分了一层层的次序,每层提供相应的接口,通过接口层层调用,从而完成相应的功能,层次如下: 所以当我们的程序运行的时候,我们使用了一些库函数就是api接口的调用,运行库再调用系统

2017-03-10 15:29:25 376

原创 将一个字符串中的空格字符替换成另外一个字符串

将一个字符串中的一个空格替换成另外一个字符串,首先需要解决字符串长“%20”就需要每遇到一个空格字符就得增加两个长度,接下来就是遍历字符串,并且遇到空格就替换,可想而知,从前往后遍历比较麻烦繁琐,所以这里我选择从后往前遍历,具体代码如下:class Solution {public: void replaceSpace(char *str,int length) { int

2017-03-04 14:37:38 1447

原创 类模板、绑定器与参数推演

当我们执行一段代码时,如果有一个循环调用一个函数,那就有不断的函数栈贞的开辟与回退,就造成效率底下,在c++中我们可以用模板解决这个问题,模板在编译阶段就被确定。template<typename T>//二元比较器class Less{public: typedef T value_type; bool call(T a1,T a2) { return

2016-12-07 19:14:32 350

原创 类模板以及赋值运算符重载、拷贝构造函数

编译器默认的拷贝构造函数,是发生的浅拷贝,像指针的赋值就会让指针指向同一个地址空间,析构时就会对同一个地址空间释放两次,就会造成程序崩溃. 自定义在模板内的拷贝构造函数:Queue(const Queue<T> &src)//类对象的拷贝构造函数 { //Queue(); _pfirst = _prear = NULL; QueueItem*

2016-12-05 22:47:18 2098

原创 拷贝构造函数与赋值运算符的重载函数

#define _CRT_SECURE_NO_WARNINGS//#include<stdio.h>//#include<stdlib.h>#include<string.h>using namespace std;#include<iostream>#include<vld.h>class CGoods{public: CGoods(char *pname,int amou

2016-11-27 21:19:26 275

原创 C++对象生命周期

class Test{public: Test(int a = 5, int b = 5) // Test(); Test(10); Test(10, 10); { ma = a; mb = b; cout << "Test(int, int)" << " ma:" << ma << "mb:" << mb << endl;

2016-11-23 00:10:13 582

原创 linux内核实现的通用链表思想

在linux内核中实现通用链表的思想: 1.定义两个结构体,一个结构体(这里我称其为内层结构体)是只有指针成员,用于负责结构体的连接,前驱与后继等,另一个结构体(这里叫做外层机构体)相当于是留给用户自己定义的 ,自己想要什么存放什么类型的数据类型就自己定义什么样的类型,在一个就是将上一个结构体当作成员在这个结构体中,用的时候就只需要使用接口选择插入删除方法即可,而不用考虑怎样插入或者删除等具体的细

2016-10-29 14:38:57 359

原创 结构体数组与指针

struct Student //定义的结构体类型 相当于int 、float这些类型 ,是用户自定义的{ char name[20]; int num; float score;}s[5] = { { "nijiushidiao", 1, 99 }, { "nijiuqua",2, 89 } }, *p = s; /* s[5]、*p这些是这种类型的变量名,他在函数体

2016-07-06 17:50:01 1149

原创 全局变量与局部变量

#includeint i = 10;//1.定义的全局变量,生命周期从此处定义时开始到此程序结束,作用域为文件作用域,int j;//2.全局变量均存放在数据段这个存储区域,未初始化时编译器自动赋值为0;int main(){printf("i_%d\n",i);//10; printf("%d",j);//0;3.证明了第2点;printf("&i_%d\n", &i);//4.打印存储在数据段

2016-07-02 21:37:03 303

空空如也

空空如也

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

TA关注的人

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