鱼思故渊的专栏

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

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

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

2014-02-28 08:20:15

阅读数 4612

评论数 5

线程安全与可重入

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

2014-02-27 22:09:38

阅读数 1518

评论数 0

boost::shared_ptr的使用方法

1. boost::shared_ptr的用法  下面用一个简单的例子说明shared_ptr的用法:   #include #include class A { public: void print() { printf("class A pri...

2014-02-27 21:59:15

阅读数 12548

评论数 2

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

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

2014-02-26 11:15:13

阅读数 2534

评论数 0

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

#include #include #include "kn_common.h" MODULE_LICENSE("Dual BSD/GPL"); struct student { int id; char* name; struc...

2014-02-25 16:31:57

阅读数 1616

评论数 0

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

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

2014-02-25 16:13:42

阅读数 2386

评论数 0

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

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

2014-02-25 14:46:41

阅读数 1792

评论数 3

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

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

2014-02-25 11:39:20

阅读数 3905

评论数 1

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

内核中的队列是以字节形式保存数据的,所以获取数据的时候,需要知道数据的大小。 如果从队列中取得数据时指定的大小不对的话,取得数据会不完整或过大。 内核中关于队列定义的头文件位于: include/linux/kfifo.h 头文件中定义的函数的实现位于:kernel/kfifo.c 内核队列编程需...

2014-02-25 11:20:15

阅读数 3011

评论数 0

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

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

2014-02-24 21:52:16

阅读数 1745

评论数 0

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

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

2014-02-24 21:12:10

阅读数 4288

评论数 0

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

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

2014-02-23 09:20:21

阅读数 1979

评论数 1

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

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

2014-02-21 17:08:08

阅读数 6177

评论数 2

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

本文将从一个使用libevent的小例子出发,解释libevent处理事件的流程. 例子如下: 01.static void fifo_read(int fd, short event, void *arg) {...} 02.  03.int main (int argc, char *...

2014-02-21 12:16:12

阅读数 1923

评论数 0

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

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

2014-02-21 11:44:45

阅读数 3641

评论数 0

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

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

2014-02-20 21:24:27

阅读数 2240

评论数 0

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

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

2014-02-20 16:05:30

阅读数 2028

评论数 0

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

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

2014-02-19 15:18:59

阅读数 2689

评论数 0

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

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

2014-02-18 21:58:33

阅读数 1837

评论数 0

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

一、在event_base_loop()函数中有和时间相关的部分:         其中tv_cache用来记录时间缓存的,base->tv_cache.tv_sec = 0; 在这里讲时间缓冲清空,在while()循环中,首先校正时间(timeout_correct(base,&t...

2014-02-18 19:48:04

阅读数 1563

评论数 0

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