自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

  • 博客(21)
  • 资源 (3)
  • 收藏
  • 关注

原创 什么是野指针?迷途指针!悬空指针!

一、迷途指针迷途指针与野指针指的是不指向任何合法的对象的指针。当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针。若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果。因为此时迷途指针所指向的内存现在包含的已经完全是不同的数据。通常来说,若原来的程序继续

2014-02-28 08:20:15 5888 5

原创 线程安全与可重入

首先可以参考维基百科中关于线程安全和可重入的解释来思考问题,两个是不同的概念,摘录维基百科的一段解释:可重入与线程安全两个概念都关系到函数处理资源的方式。但是,他们有一定的区别。可重入概念会影响函数的外部接口,而线程安全只关心函数的实现。大多数情况下,要将不可重入函数改为可重入的,需要修改函数接口,使得所有的数据都通过函数的调用者提供。要将非线程安全的函数改为线程安全的,则

2014-02-27 22:09:38 1636

原创 boost::shared_ptr的使用方法

1. boost::shared_ptr的用法 下面用一个简单的例子说明shared_ptr的用法: #include #include class A {public: void print() { printf("class A print!\n"); }};int main(int argc, char **argv) {

2014-02-27 21:59:15 21375 2

原创 回调函数在非阻塞模式中的使用

本来是想介绍回调函数在非阻塞模式的地位,但是在这之前需要知道这些基本知识。然后再验证回调函数的作用一、同步与异步同步/异步, 它们是消息的通知机制1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。但是一般而言,我们在说同步、异步的时候,特

2014-02-26 11:15:13 3972

原创 linux内核分析--内核中的数据结构之红黑树(续)

#include#include #include "kn_common.h"MODULE_LICENSE("Dual BSD/GPL");struct student{ int id; char* name; struct rb_node node;};static int insert_student(struct student*, struct r

2014-02-25 16:31:57 1845

原创 linux内核分析--内核中的数据结构之红黑树(四)

红黑树由于节点颜色的特性,保证其是一种自平衡的二叉搜索树。红黑树的一系列规则虽然实现起来比较复杂,但是遵循起来却比较简单,而且红黑树的插入,删除性能也还不错。所以红黑树在内核中的应用非常广泛,掌握好红黑树,即有利于阅读内核源码,也可以在自己的代码中借鉴这种数据结构。红黑树必须满足的规则:所有节点都有颜色,要么红色,要么黑色根节点是黑色,所有叶子节点也是黑色叶子节点中不包含数据非

2014-02-25 16:13:42 2897 1

原创 linux内核分析--内核中使用的数据结构之哈希表hlist(三)

前言:1.基本概念:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2. 常用的构造散列函数的方法散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。散列表的常

2014-02-25 14:46:41 2258 3

原创 linux内核--使用内核队列实现ringbuffer(续)

一、ring buffer      在以前的一篇文章--网络编程中接受缓冲的ringbuf的简单实现介绍了一个自己写的ringbuffer,其实原理和linux内核中的队列很相似,思想是一样的,只不过处理的没有内核那么恰当巧妙,这里也可以使用linux内核中的队列实现之。/**@brief 仿照linux kfifo写的ring buffer *@atuher Anker date:

2014-02-25 11:39:20 6736 1

原创 linux内核分析--内核中的数据结构之队列(二)

内核中的队列是以字节形式保存数据的,所以获取数据的时候,需要知道数据的大小。如果从队列中取得数据时指定的大小不对的话,取得数据会不完整或过大。内核中关于队列定义的头文件位于: include/linux/kfifo.h头文件中定义的函数的实现位于:kernel/kfifo.c内核队列编程需要注意的是:队列的size在初始化时,始终设定为2的n次方使用队列之前将队列结构体中的

2014-02-25 11:20:15 3885

原创 linux内核分析--内核中的数据结构之双链表(续)

在解释完内核中的链表基本知识以后,下面解释链表的重要接口操作:1. 声明和初始化实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_HEAD()这个宏:#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) struct

2014-02-24 21:52:16 2006

原创 linux内核分析--内核中的数据结构之双链表(一)

下面直接进入正题:在了解了基本内容看具体实现,只知道数据成员list的地址,怎样去访问自身以及其他成员呢?在include/linux/list.h头文件中可以看到这段代码!#define list_entry(ptr,type,member) / container_of(ptr,type,member)其中container_of这个宏在/include/linu

2014-02-24 21:12:10 5173

转载 libevent源码分析---回顾主要的结构体

以前忘记说明,这里源码分析使用的是libevent库的1.4.12-stable版本,在2.0以上的版本都是4W+行,过于庞大,网络上看到关于libevent库中几个重要的结构体关系图,很清楚很好,感谢原作者的细致:(虚线部分代表包含关系)一、tail_queue       关于tail_queue的解释在上篇文章中很细致。二、event   //event提供了函数接口

2014-02-23 09:20:21 2200 1

原创 libevent源码分析-- queue.h中TAILQ_QUEUE的理解

libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,但是是一个缩减版本,而且没有看到queue 的access method,不知道是不是跟我们的linux服务器版本有关,没办法google了一下,找到了FreeBSD 下queue.h的定义,我们看一下tail queue的定义#define TAIL

2014-02-21 17:08:08 7449 3

原创 libevent源码分析--I/O事件

本文将从一个使用libevent的小例子出发,解释libevent处理事件的流程.例子如下:01.staticvoid fifo_read(intfd, short event, void *arg) {...}02. 03.intmain (int argc, char **argv)04.{05.intsocket = open ("/t

2014-02-21 12:16:12 2149

原创 libevent源码分析--定时器和信号事件处理

Timer事件反应堆event_base包含了一个最小堆min_heap结构体的实例,以此维护注册到这个反应堆实例的定时器事件:view sourceprint?1.structevent_base {2.//其他成员3.structmin_heap timeheap;4.};回顾一下最小堆min_heap:view sour

2014-02-21 11:44:45 4531

转载 libevent源码分析--libevent库对信号事件的处理

信号的处理在libevent中也是一个很重要的部分,同时处理的也很巧妙,这里根据自己的理解分析其堆信号的处理。和信号相关的几个重要API都是如何调用的。这是网上关于libevent处理信号的过程图解(感谢原作者,由这个图来分析libevent如何处理信号的)一、evsignal_init()函数(这里的分析都是按照IO复用机制的epOLL)       这个信号初始化在epol

2014-02-20 21:24:27 2544

原创 linux基本命令---adduser和useradd的区别

adduser命令的使用:       在使用adduser命令时,它会添加这个用户名,并创建和用户名名称相同的组名,并把这个用户名添加到自己的组里去,并在/home目录想创建和用户名同名的目录,并拷贝/etc/skel目录下的内容到/home/用户名/的目录下,并提示输入密码,并提示填写相关这个用户名的信息。比如创建用户myadminroot@xxx:/xxx# addu

2014-02-20 16:05:30 2994

原创 虚拟机联网--NAT方式 使用inode后联网

虚拟机联网--NAT方式一般安装上虚拟机并在虚拟机上安装上ubuntu系统后,基本上不需要做什么设置就可以上网了,如果出现不能联网的情况,可以根据以下方法,检查自己的主机和VM是不是有哪些配置或者服务配置不对,无需逐项检查,只针对自己情况即可,我当时的问题就是有一个VM 的DHCP service在系统启动的时候没有自动开启,开启后,就一切正常了。哈,祝好运!

2014-02-19 15:18:59 3437

原创 libevent源码分析--如何将定时器和信号事件都集合到I/O复用中

我的理解:       在I/O多路复用机制用(这里使用epoll作为例子),epoll_wait在一定的时间内监听需要受到关注的套接字,如果只是关注I/O事件,这样就会很简单,在设置时间的时候没有任何限制,此函数返回后,得到的有事件的套接字的个数,在libevent中使用的event_base_loop这个函数打到这个目的的,里面的evse->dispatch()这个函数就是epoll_wa

2014-02-18 21:58:33 2221

原创 libevent源码分析---时间管理模块

一、在event_base_loop()函数中有和时间相关的部分:        其中tv_cache用来记录时间缓存的,base->tv_cache.tv_sec = 0; 在这里讲时间缓冲清空,在while()循环中,首先校正时间(timeout_correct(base,&tv);),这个校正是存在目的的,接下来再介绍,时间校正结束再在最小堆中找最小时间,使用的函数为timeout_ne

2014-02-18 19:48:04 1774

原创 realloc malloc calloc 三个函数的区别

三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL

2014-02-18 13:53:59 1656

nginx源码分析--带注释

nginx源码分析,分析过程中将重要的部分进行了注释,以便理解

2014-11-26

libevent-1.4.12-stable-注释版

注释了libevent中很关键的部分,很重要的接口函数。

2014-03-07

空空如也

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

TA关注的人

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