自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 muduo异步日志——core dump后查找还未来得及写出的日志

目录前言生成core文件gdb调试Core文件前言 通过异步日志的实现可以知道,日志消息并不是生成后立刻就会写出,而是先存放在前端缓冲区currentBuffer或者前端缓冲区队列buffers中,每过一段时间才会将缓冲区中的日志消息写到日志文件中。那么这就会有问题了:如果程序在中途core dump了,那么在缓冲区中还未来得及写出的日志消息该如何找回呢?...

2019-11-26 16:01:50 1208

原创 muduo源码学习(2):异步日志——异步日志的实现

目录什么是异步日志异步日志的实现前端与后端前端与后端的交互资源回收后端与日志文件滚动日志自动flush缓冲区开启异步日志功能总结 在前文中分析了日志消息的存储和输出,不过并没有涉及到异步日志,下面就来分析一下异步日志是如何实现的。什么是异步日志 在默认的情况下,日志消息都是直接打印到终端屏幕上,但是实际应用中,日志消息...

2019-11-25 22:51:21 2218 2

原创 muduo源码学习(1):异步日志——日志消息的存储及输出

目录前言日志存储的实现日志输出的实现总结前言 muduo中的日志,是诊断日志。用于将代码运行时的重要信息进行保存,方便故障诊断和追踪。 日志一般有两种,一种是同步日志,一种是异步日志,同步日志就是当需要写出一条日志信息的时候,只有等到这条日志消息完全写出之后才能执行后续的程序,可见,这种方式的日志的问题就在于程序可能会阻塞在磁盘写入操作上;...

2019-11-25 22:50:41 1218 1

原创 UNIX五种IO模型理解

以下以读数据为例,写数据同理。读数据的两个阶段读数据有两个阶段:①内核中有数据可读;(下文称为第一阶段)②数据从内核缓冲区拷贝到用户缓冲区。(下文称为第二阶段)五种IO模型UNP中提到的五种IO模型:读数据以recvfrom为例。①阻塞式IO模型: fd设置为阻塞,调用recvfrom函数时,recvfrom函数会一直阻塞,直到第二阶段达成才会返回;②...

2019-10-31 22:30:50 297

原创 STL源码分析:浅析string和vector<char>的区别

目录前言转换为C-style字符串重载输入输出流操作符重载+、+=操作符前言 为什么会关注string和vector<char>的区别? 先来说下string这个“类”。 string和vector、list、deque等容器不一样,在STL中并不存在class string{...},它实际上是一个全局类型,通过typed...

2019-10-24 11:57:13 2689

原创 STL源码分析:sort函数

目录支持sort的容器几种涉及到的排序算法插入排序快速排序堆排序sort函数的策略sort函数的实现STL的sort函数非常常用,不同的STL版本有不同的实现方式,本文就来说一下SGI STL中是如何实现sort函数的。 sort函数所采用的排序方法并非是“一种”,而是“多种”排序算法的“混合物”。在SGI STL的版本中,对一个序...

2019-10-10 23:07:51 712

原创 STL源码分析:浅析list的sort函数

目录原理说明举例说明总结 虽然STL中提供了标准的sort函数,但是它只适用于随机存取的容器,而显然list并不是这样的容器,因此list提供了专用的链表排序函数,虽然同样名为sort,但是这个sort函数是list类的成员函数。 在分析list的sort函数之前,有必要先简单了解一下list其它几个相关的成员函数。swap函数:传入参数为一个li...

2019-10-07 22:01:54 829

原创 STL源码分析:空间配置器浅析

目录allocatoralloc一级配置器二级配置器自由链表内存分配allocate_S_refill函数_S_chunk_alloc函数内存释放deallocate为什么要使用free_list?为什么free_list要把128bytes分成16部分?对于一些容器如vector、map、set之类的,都需要一个模板参数Alloc...

2019-09-27 17:07:47 337

原创 从源码理解智能指针(二)—— shared_ptr、weak_ptr

目录计数器_Ref_count_Ref_count_del_Ref_count_del_alloc_Ptr_base_Ptr_base的成员变量构造函数赋值重载获取引用计数减少引用计数_Reset函数_Resetw函数shared_ptr构造函数无参构造用一般参数构造用完整对象构造移动构造析构函数赋值重载reset...

2019-09-24 09:53:37 11474 4

原创 C++11中的模板特例化

目录函数模板特例化类模板特例化 最近在看智能指针的源码,发现其中用了很多模板特例化,本文就来总结一下,什么是模板特例化。 特例化,顾名思义:特殊实例化,将函数模板或类模板实例化为特殊的类型,通过模板特例化可以定制在特定模板参数下的函数模板/类模板实现,或者禁用特定模板的函数模板/类模板。函数模板特例化 既然是特例化,那么自然就需要有一个“原型”,现在...

2019-09-22 09:22:23 1477

原创 从源码理解智能指针(一)——auto_ptr、unique_ptr

目录auto_ptr构造函数拷贝赋值让auto_ptr对象具有指针的行为析构函数unique_ptr_Unique_ptr_baseremove_reference_Get_deleter_pointer_type_Unique_ptr_base的第三个模板参数构造函数无参/NULL构造用管理对象实例构造用管理对象实例及删除器实例构造用另...

2019-09-20 16:05:35 1062 1

原创 从反汇编理解指针和引用的区别

目录初始化赋值取地址总结本文主要基于反汇编代码,从初始化、赋值以及取地址三个角度来理解指针和引用的区别。初始化 写出以下代码并查看反汇编代码:int main(){ int x = 5; int * ptr = &x; //指针 int & ref = x; //引用 return 0;}...

2019-09-05 19:54:07 556 1

原创 模板函数——后置返回值类型(trailing return type)

后置返回值类型主要用于模板函数中,它是C++11推出的新用法。其中使用到了auto和decltype两种类型说明符。 auto和decltype虽然都是类型说明符,但是二者是不同的:auto是根据推导初始值的类型来确定变量的类型,而decltype则只是确定类型,如下所示:auto i = x + y; //通过x+y的结果类型来推导出i的类型并对其初始化...

2019-09-05 12:58:10 3530

原创 libevent源码学习(19):缓冲区抽象bufferevent

目录引言bufferevent结构bufferevent_private结构体bufferevent结构体创建一个基于socket的bufferevent启动buffereventEVUTIL_UPCAST宏函数bufferevent水位设置bufferevent从fd中读取数据bufferevent向fd中写入数据从bufferevent中读出数据...

2019-08-30 15:47:54 906

原创 libevent源码学习(18):缓冲区结构evbuffer

目录evbuffer结构体evbuffer_chain结构evbuffer及evbuffer_chain的创建向evbuffer中插入一个evbuffer_chain向evbuffer中添加数据向evbuffer的尾部添加数据在evbuffer的头部插入数据从evbuffer中提取数据拷贝式提取数据提取后删除数据evbuffer预留一定大小的空间从f...

2019-08-27 18:16:45 1160

原创 libevent源码学习(17):缓冲管理框架

目录Libevent缓冲区类型Libevent缓冲区结构缓冲区的读出与写入缓冲区的读入与写出缓冲区水位机制缓冲区回调机制延迟回调机制Libevent缓冲区类型 Libevent中提供了多种类型的缓冲区:基于套接字的缓冲区、针对Windows IOCP的bufferevent、在传输和接收数据之前进行数据处理(比如压缩)的过滤型缓冲区和成对传输的缓冲区...

2019-08-26 11:21:09 467

原创 C++中的虚函数表和虚函数在内存中的位置

目录结论 今天在看别人面经的时候发现了这个问题,一时间发现自己也说不清楚,还想当然的以为“虚函数表既然是类对象公有的,那么应该在静态存储区”,想当然终究只是想当然,经过试验得知,这种想法是错误的。 由于不同的编译器在虚函数表上的实现可能不同,下面以g++来进行分析。 先创建一个有虚函数的类A,如下所示:class A{public:...

2019-08-01 13:15:21 14256 14

原创 libevent源码学习(16):通知唤醒主线程、条件变量的等待与唤醒

目录唤醒事件机制唤醒机制相关结构体创建唤醒event次线程唤醒主线程条件变量等待与唤醒以下源码均基于libevent-2.0.21-stable。 在前面的文章中,把Libevent对三种不同类型event的创建、添加、激活到处理过程基本上就讲的差不多了,接下来就讲一下其它的问题。目前版本Libevent是支持多线程的,既然是多线程,就会出现一系列与线程安全...

2019-07-31 17:20:48 1003 1

原创 Linux进程间通信——eventfd

Table of Contents什么是eventfd创建eventfd读eventfd写eventfd使用例子什么是eventfd eventfd是Linux 2.6提供的一种系统调用,它可以用来实现事件通知。eventfd包含一个由内核维护的64位无符号整型计数器,创建eventfd时会返回一个文件描述符,进程可以通过对这个文件描述符进行read/writ...

2019-07-31 17:19:45 16998 1

原创 libevent源码学习(15):信号event的处理

目录信号event处理流程与信号event相关的结构体初始化工作创建一个信号event添加一个信号event信号回调函数信号event的激活 Libevent中的event,主要分为三大类:io读写event、超时事件以及信号event。前面的文章对前两类的event都进行了分析,下面就来说一下Libevent是如何处理信号event的。信号e...

2019-07-29 23:54:03 768

原创 libevent源码学习(14):IO复用模型之epoll的封装

目录Libevent提供的epoll后端结构体初始化epoll_init何时调用epoll_init事件添加epoll_nochangelist_add何时调用epoll_nochangelist_add事件删除epoll_nochangelist_del何时调用epoll_nochangelist_del事件监听epoll_dispatch为什么evmap_i...

2019-07-26 20:18:28 820 1

原创 libevent源码学习(13):事件主循环event_base_loop

目录开启事件主循环执行事件主循环校对时间阻塞/非阻塞处理激活队列中的event事件主循环的退出event_base_loopexitevent_base_loopbreak开启事件主循环 在libevent中,事件主循环的作用就是执行一个循环,在循环中监听事件以及超时的事件并且将这些激活的事件进行处理。libevent提供了对用户开放了两...

2019-07-25 16:57:35 3189 2

原创 libevent源码学习(12):超时管理之common_timeout

目录前言common_timeout的作用common_timeout的结构定义common_timeout与一般timeout的区分获取common_timeout在common_timeout_queues中的下标判断一个timeval是否为common_timeout判断两个timeval是否是同样的common_timeout获取common_timeout...

2019-07-25 16:57:25 1075 1

原创 libevent源码学习(11):超时管理之min_heap

目录min_heap的定义向min_heap中添加eventmin_heap中event的激活以下源码均基于libevent-2.0.21-stable。 在前文中,分析了小顶堆min_heap这一数据结构,并提到了Libevent就是利用min_heap来实现定时器的,接下来就分析一下min_heap是如何实现定时器的。 对于每一个需要监听的eve...

2019-07-25 16:56:55 512

原创 libevent源码学习(10):min_heap数据结构解析

目录min_heap类型定义min_heap函数构造/析构函数及初始化判断event是否在堆顶判断两个event之间超时结构体的大小关系判断堆是否为空及堆大小返回堆顶event分配堆空间堆元素的上浮堆元素的下沉堆插入元素堆删除元素弹出堆顶元素以下源码均基于libevent-2.0.21-stable。 在libevent中,使...

2019-07-25 16:56:29 759

原创 libevent源码学习(9):事件event

目录在event之前需要知道的event_baseevent结构体创建/注册一个event向event_base中添加一个event设置event的优先级激活一个event删除一个event获取指定event的状态纯超时event以下源码均基于libevent-2.0.21-stable。 有了event_base作为Reactor事件处理模...

2019-07-25 16:55:51 747

原创 libevent源码学习(8):event_signal_map解析

目录event_signal_map结构体向event_signal_map中添加event激活event_signal_map中的event删除event_signal_map中的event以下源码均基于libevent-2.0.21-stable。 在前文中分析了event_io_map,在windows环境下event_io_map定义为哈希表结构,而在非...

2019-07-25 16:54:54 481

原创 libevent源码学习(7):event_io_map——哈希表数据结构解析

目录event_io_map哈希表操作函数hashcode与equals函数哈希表初始化哈希表元素查找哈希表扩容哈希表元素插入哈希表元素替换哈希表元素删除自定义条件删除元素哈希表第一个非空元素哈希表下一个元素释放哈希表向event_io_map中添加event激活event_io_map中的event删除event_io_map中的e...

2019-07-25 16:54:24 767 1

原创 C/C++:位域、符号扩展

目录位域定义符号扩展位域使用位域值的计算及赋值位域的对齐原则位域定义 什么是位域?用一个简单的例子来说,假如你在类/结构体中定义了一个变量,这个变量的取值只可能是0~3之类的(比如某种标志位),明明只需要用2个二进制位就可以存下来的,结果你必须得至少为其分配1个字节进行存储(比如用char,甚至是int),这样就至少有6个二进制位是毫无作用的,并且由于内存对...

2019-07-09 19:11:24 1087

原创 dup、dup2实现文件描述符重定向(标准输入、标准输出、标准错误输出)

目录dup函数dup2函数重定向标准输入重定向标准输出重定向标准错误输出重定向恢复总结 在前文中,可以知道,文件描述符实际上是指向文件表项的指针数组索引,也就相当于每个文件描述符都对应一个文件表项,最终对应一个文件,而文件描述符重定向,则是让一个文件描述符指向另一个特定的文件表项,最终使得不同的文件描述符指向同一个文件表项,常用到的函数就是dup、dup2以...

2019-07-06 11:12:01 7891 2

原创 Linux中文件描述符的理解(文件描述符、文件表项、i-node)

目录前言打开文件描述符表文件表项inode节点总结前言 本文中涉及到的Linux源码来源于linux 2.6.39.4。 就像windows中的句柄一样,学习linux经常会碰到文件描述符,我们都知道文件描述符是一个非负整数,每一个文件描述符都唯一对应了一个打开的文件,那么文件描述符在内核中到底是以什么形式存在的呢? 这个问...

2019-07-04 19:03:50 10190 9

原创 Exe4j可执行文件报错:No JVM could be found on your system. Please define EXE4J_JAVA_HOME ......

问题背景 使用exe4j生成的可执行文件,在自己电脑上运行正常,但是在其他电脑上运行就出现No JVM could be found on your system.的错误。解决方法1.确保电脑装有java运行环境(jre);2.确保jre的版本与使用exe4j生成exe时设置的版本一致,保证jre的版本在Minumum与Maximum之间;3.确保用于...

2019-07-01 18:25:13 15013 6

原创 libevent源码学习(6):事件处理基础——event_base的创建

目录前言创建默认的event_baseevent_base的配置event_config结构体创建自定义event_base——event_base_new_with_config禁用(避免使用)某一种IO复用模型设置IO复用模型需要满足的特征设置event_base的flag特性获取event_base所满足的特征获取当前系统所支持的IO复用模型总结...

2019-07-01 15:53:18 1148 2

原创 MFC中CListCtrl改变选中行(选中列)的颜色实现选中高亮的效果

在项目中遇到了这样的需求,需要对选中行进行高亮,查了一下相关的资料,记录一下自己采用的方法。 先在List控件所在类中(这里是CListshow,继承于CListCtrl)添加两个变量SelectRow和SelectCol,用于保存鼠标点击的单元格的行数和列数:class CListshow : public CListCtrl{ ...... ...

2019-06-27 17:37:26 7443 6

原创 C++知识积累:继承关系(含虚函数)下类的内存布局

目录1 无继承2 一般继承2.1 单继承2.2 多层继承2.3 多重继承2.4菱形继承3 虚继承3.1 虚继承的布局3.2 虚继承的多层继承3.3 虚继承的菱形继承总结1 无继承 类A定义如下:class A{private: int A_1;public: static int A_2; int A_3; ...

2019-06-22 14:21:15 1495 10

原创 libevent源码学习(5):TAILQ_QUEUE解析

目录前言结点定义链表初始化链表查询及遍历链表查询链表遍历插入结点头插法尾插法前插法后插法删除结点替换结点总结前言 在libevent中使用到了TAILQ数据结构,看了一下其他资料,发现TAILQ这一数据结构不仅仅用于libevent中,在很多其他地方像linux内核中也有使用。它的内部实际上就是一个双向链表,可以实现结点...

2019-06-19 21:11:02 941 2

原创 libevent源码学习(4):线程锁、条件变量(二)(调试锁)

目录EVUTIL_ASSERT宏开启调试锁调试锁结构调试锁函数debug_lock_allocdebug_lock_freedebug_lock_lock加锁检测debug_lock_unlock解锁检测调试锁下的条件变量函数总结以下源码均基于libevent-2.0.21-stable。 在上一章中,分析了线程锁函数以及条件变...

2019-05-23 13:41:56 436

原创 libevent源码学习(3):线程锁、条件变量(一)(锁函数、条件变量函数设置)

目录锁与条件变量函数结构体锁函数结构体设置自定义的锁函数条件变量函数结构体设置自定义的条件变量函数使用posix线程函数默认的锁函数evthread_posix_lock_allocevthread_posix_lock_freeevthread_posix_lockevthread_posix_unlock默认的条件变量函数evthread_p...

2019-05-23 13:41:47 809

原创 do{...}while(0);的好处

最近阅读libevent源码时,会看到有很多宏定义中使用了do{...}while(0);,看了看一些资料,发现很多源码也会这么写,那么do{...}while(0);的好处是什么呢?这里说一下常见的两种用法:保证宏定义的正确使用 举个例子,如果现在定义如下一个宏:#define FUN \ f1(); \ f2();...

2019-05-22 11:22:16 1727

原创 关于MFC中使用ShellExecute出现的进程冲突问题

目录问题背景问题分析问题背景 现在有一个MFC写的界面程序,以及一个外部exe文件。用户通过界面选择文件a,MFC将文件a的路径作为参数,调用exe文件生成一个解析文件b,然后MFC再读取这个文件b。 为了完成这一目的,就需要在MFC中调用外部exe文件,我这里选用的是ShellExecute函数。//function...HINSTANCE ...

2019-04-25 22:42:54 1289

深入理解linux内核(中文第三版高清带书签).zip

《深入理解linux内核》第三版pdf带书签高清。

2019-07-04

UNIX环境高级编程 .pdf 高清扫描版

UNIX环境高级编程 .pdf 高清扫描版..

2019-03-26

《TCP/IP网络编程》pdf高清扫描版

《TCP/IP网络编程》pdf高清扫描版

2019-03-26

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

TA关注的人

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