摘要:前面讲了lighttpd的fdevent系统的初始化过程。这篇要看一看lighttpd是怎样使用fdevent系统的。讲解的过程中,会详细的分析fdevent的源代码。首先还是从server.c的main函数入手。在程序的初始化过程中,当完成fdevent的初始化之后,第一个需要fdevent处理的事情就是将在初始化网络的过程中得到的监听fd(socket函数的返回值)注册的fdevent系统中。... 阅读全文
posted @ 2010-03-18 22:34 kernel@hcy 阅读(4418) 评论(1) 推荐(1) 编辑
摘要:前面讲了lighttpd的fdevents结构体以及fdevent系统的对外接口,这一篇将解析一下fdevent系统初始化。C程序在进行真正的编译之前都要进行预编译,那么,我们就先来看看fdevent系统中的一些宏。首先是fdevent.h开头的一些宏:[代码]通过上面的宏判断系统中是否有对应的多路IO系统,如果有,就定义对应的USE_XXX宏,用来方便后面程序的盘算。预编译完这些宏以后,对于当前... 阅读全文
posted @ 2010-03-17 21:31 kernel@hcy 阅读(4026) 评论(0) 推荐(1) 编辑
摘要:一、简介:伸展树,或者叫自适应查找树,是一种用于保存有序集合的简单高效的数据结构。伸展树实质上是一个二叉查找树。允许查找,插入,删除,删除最小,删除最大,分割,合并等许多操作,这些操作的时间复杂度为O(logN)。由于伸展树可以适应需求序列,因此他们的性能在实际应用中更优秀。伸展树支持所有的二叉树操作。伸展树不保证最坏情况下的时间复杂度为O(logN)。伸展树的时间复杂度边界是均摊的。尽管一个单独... 阅读全文
posted @ 2010-03-17 17:41 kernel@hcy 阅读(11669) 评论(7) 推荐(1) 编辑
摘要:前面讲了lighttpd的插件系统,这一篇将看一看lighttpd中的fdevent系统。fdevent系统主要是处理各种IO事件,在web服务器中,主要就是向socket写数据和从socket读数据。通常,web服务器是IO密集型程序,这就要求在数据的读写上,web服务器必须能够具有很好的性能,不会因为某个socket的阻塞而致使其他socket也被阻塞,否则会大大降低服务器的性能。因此,大部分... 阅读全文
posted @ 2010-03-17 17:30 kernel@hcy 阅读(5515) 评论(1) 推荐(1) 编辑
摘要:前面讲了lighttpd插件系统的加载和初始化,这一篇中,将介绍一下plugin.c中的宏PLUGIN_TO_SLOT。在将PLUGIN_TO_SLOT宏之前,我们先来看看lighttpd中插件系统的对外接口。这个接口所对的“外”指的是lighttpd服务器。前面已经提到,在运行的过程中,lighttpd不知道所加载的插件都是干什么用的,只知道这些插件所实现的接口,也就是在... 阅读全文
posted @ 2010-03-14 22:28 kernel@hcy 阅读(3505) 评论(0) 推荐(1) 编辑
摘要:前面讲了lighttpd插件系统的接口,下面我们来看看插件是怎么加载和初始化的。lighttpd的插件是以动态链接库的形式存在的。在服务器启动的时候,在初始化阶段将所有插件都加载进来。在server.c中的main函数中,加载插件是调用plugins_load函数:[代码]请读者注意一下这个函数调用的位置。这个函数是在服务器的初始化阶段进行调用的,并且该函数就在这调用了一次,其他地方没有再被调用过... 阅读全文
posted @ 2010-03-11 22:34 kernel@hcy 阅读(4887) 评论(3) 推荐(1) 编辑
摘要:在lighttpd中,使用插件的形式来增加服务的功能。同时,lighttpd提供了一个插件的公共接口给开发者,方便第三方提供额外的插件。Lighttpd的插件接口主要提供在plugin.h文件中。其中,plugin结构体是最核心的部分。plugin结构体的定义如下:[代码]可以看出,在结构体plugin的设计中,作者使用了面向对象的思想。plugin结构体就是一个虚基类,其中的数据成员,如name... 阅读全文
posted @ 2010-03-11 22:00 kernel@hcy 阅读(5035) 评论(2) 推荐(2) 编辑
摘要:lighttpd的工作模型很简单──一个主进程加多个工作进程的多进程模型,也就是所谓的watcher-worker模型。 整个程序的入口(main函数)在server.c文件中。在main函数的开始部分必然是处理参数和各种繁杂的初始化工作。其中有两个地方要重点看一起。第一个是下面的语句:[代码] 这个If语句是为了判断配置文件的语法是否合法。但是,明显,没有进行任何的测试,... 阅读全文
posted @ 2010-02-11 21:56 kernel@hcy 阅读(7076) 评论(0) 推荐(1) 编辑
摘要:我们经常在编程中碰到一种情况叫符号重复定义。多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将它们都初始化,那么链接器将A和B进行链接时会报错:[代码] 这种符号的定义可以被称为强符号(Strong Symbol)。有些符号的定义可以被称为弱符号(Weak Symbol)。对于C... 阅读全文
posted @ 2010-01-27 22:03 kernel@hcy 阅读(8427) 评论(0) 推荐(0) 编辑
摘要:无符号数和有符号数是不能进行比较运算的,否则可能会出现意想不到的错误,且极难检查出来! 首先肯几个例子(假设在32位的机器上):[代码] 结果如下:[代码] 从结果中可以看出,2 3 4都不是我们想像中的结果。在C语言中,当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两个数都是非负数,然后进行比较运算。当把一个有符号数转换成无符号数时,其底层的二进制表示没有... 阅读全文
posted @ 2010-01-06 10:17 kernel@hcy 阅读(3069) 评论(1) 推荐(0) 编辑
摘要:发信人: nadia (speak softly love), 信区: mood标 题: 希望能够带给你温暖,一封尘封了八年的信(原文)发信站: 兵马俑BBS (Wed Nov 18 19:52:46 2009), 本站(bbs.xjtu.edu.cn)这是一封无意间发现的信,一封来自八年前的信,这也是交大人情感的延续,在这个寒冷的冬季,这封信令我们的心充满温暖,同时也希望它能温暖更多的人....... 阅读全文
posted @ 2009-11-19 23:04 kernel@hcy 阅读(1061) 评论(3) 推荐(2) 编辑
摘要:etag的全称是entity tag(标记实体值),在RFC2616中关于etag的定义如下:The ETag response-header field provides the current value of the entity tag for the requested variant. The headers used with entity tags are described in... 阅读全文
posted @ 2009-11-16 21:53 kernel@hcy 阅读(1747) 评论(0) 推荐(0) 编辑
摘要:使用一个比特位来表示一个事件的两种状态,即节省内存,又可以提高运行速度。在Lighttpd中,提供了一个bitset数据结构,用来管理使用一个比特位集合。 在bitset.h中,比特位集合的数据结构定义如下:typedef struct{ size_t *bits; size_t nbits;} bitset;bits指向一个size_t类型的数组,存放bit集合。size_t类型通常被定... 阅读全文
posted @ 2009-11-04 21:35 kernel@hcy 阅读(1744) 评论(0) 推荐(0) 编辑
摘要:在web服务器中,通常要设计很多字符串的处理。比如客户端请求的 URI地址、发送的 query参数、post 提交的数据等等都是一串字符。因此,提供对字符串的灵活高效的处理,对lighttpd的效率至关重要。 在lighttpd中,buffer提供了对字符串的处理。在buffer.h中,有如下的数据结构定义: //定义buffer[代码] 上面的结构体定义了lighttpd中,对字符串处理的基本结... 阅读全文
posted @ 2009-11-04 20:52 kernel@hcy 阅读(3328) 评论(2) 推荐(0) 编辑
摘要:Lighttpd提供了一个通用数组,这个数组与程序的其他部分练习较少,因此可以单独进行分析。 首先要说一下Lighttpd中的定义的一些数据结构。 在array.h中有下面的定义:[代码]这是一个枚举类型,定义了各个数据类型的标志。从中可以看出程序中所定义使用的数据类型的种类和个数。Lighttpd在定义数据类型的时候使用了面向对象的思想,因此,程序具有很好的扩展性和适应性。这些类型中,最重要的是... 阅读全文
posted @ 2009-10-23 20:42 kernel@hcy 阅读(4839) 评论(0) 推荐(4) 编辑