thttpd源码分析
来源:互联网 发布:帝国cms修改栏目目录 编辑:程序博客网 时间:2024/05/16 12:39
由于最近要自己实现一个嵌入式web服务器,所以开始了对嵌入式web服务器的相关学习。为了使自己对服务器了解更加深入,便找到了开源的服务器进行了相关学习。‘
首先学习的是 thttpd
thttpd 是一个小型的 HTTP 服务器
官方网址:http://www.acme.com/software/thttpd/
下载 version 2.25b 的源码后解压,切换到源码目录,编译步骤为:
./configure
make
thttpd一共有16个源文件:
config.h fdwatch.h libhttpd.h match.h mmc.h tdate_parse.h timers.h version.h
fdwatch.c libhttpd.c match.c mmc.c strerror.c tdate_parse.c thttpd.c timers.c
fdwatch是套接字管理模块
mmc是内存管理模块
timers是定时器管理模块
libhttpd实现http 服务端的处理方法
thttpd实现了主函数
下面是主模块的大体流程图:main
{
打开系统日志
处理main参数
读取流控配置文件
设置uid
获取当前工作目录
切换到后台模式
创建子进程,父进程结束
获取系统资源信息
注册处理系统信号的函数
初始化定时器资源
初始化HTTP SERVER 对象
创建系统定时器
创建连接表数组
将监听套接字加入select集合
主循环
{
获取套接字集合发生的事件
检查套接字上的发生的具体行为
接收新的连接
处理新的连接
}
销毁http server对象
关闭系统日志
退出
}
mmc模块分析
映射文件到内存,如果定义了HAVE_MMAP,使用mmap,否则使用malloc。
mmc_map函数的步骤是:
查找哈希表,如果已经存在于哈希表中,直接从表中取出,然后返回;
否则查找free_maps,如果free_maps可用,直接取出来用,free_maps为空时,malloc一块内存使用;
接下来判断文件大小,大小不为0时,因为定义了HAVE_MMAP,所以使用mmap内存映射文件;
然后把这个Map结构体添加到哈希表中,同时把这个Map添加到全局变量maps的链表头部。
mmc_unmap函数的步骤:
首先在哈希表中查找这个Map结构,如果没有找到,遍历全局变量maps链表寻找;
如果都没有找到或者找到后发现引用计数<=0,打印错误日志,函数结束;
找到了就减少这个Map的引用计数。
mmc_cleanup函数的步骤:
遍历全局变量maps,当此Map上的引用计数为0或者时间过期了,调用really_unmap。
如果空闲总数大于DESIRED_FREE_COUNT,循环删除全局变量free_maps链表的头部的元素,直到
free_count<=DESIRED_FREE_COUNT
really_unmap函数的步骤:
munmap取消内存映射,将这个Map结构添加到free_maps链表的头部,减少映射总数,增加空闲总数
mmc_destroy函数的步骤:
遍历maps链表,调用really_unmap,然后遍历free_maps链表,释放内存,减少空闲总数、分配总数。
check_hash_size函数的步骤:
当hash_table为空时,初始化hash_size、hash_mask,
当hash_size >= 3倍的映射总数,直接返回,
否则释放掉原先的哈希表,增大hash_size,
malloc (hash_size)大小的内存,遍历maps链表,调用add_hash将所有元素
添加到哈希表中。
fdwatch模块分析
此源文件根据Makefile中的宏定义决定采用哪种模型。
select,kqueue -- BSD系统
poll -- SysV系统
fdwatch_get_nfiles函数的功能:
获取可操作的文件描述符总数;
根据HAVE_SELECT,HAVE_POLL,HAVE_DEVPOLL,HAVE_KQUEUE这其中的哪个宏被定义,
调用宏INIT,因为HAVE_SELECT宏被定义,所以INIT被定义为select_init。
fdwatch_add_fd
宏ADD_FD被定义为select_add_fd
fdwatch_del_fd
宏DEL_FD被定义为select_del_fd
fdwatch
宏WATCH被定义为select_watch
fdwatch_check_fd
宏CHECK_FD被定义为select_check_fd
fdwatch_get_next_client_data
宏GET_FD被定义为select_get_fd
- thttpd源码分析
- thttpd源码分析
- thttpd源码分析
- thttpd源码分析
- thttpd源码分析
- thttpd 2.25b源码分析
- thttpd 2.25b源码分析
- thttpd 2.25b源码分析
- thttpd源码分析-----http协议头部检测
- thttpd源码小分析之Reactor pattern
- thttpd源码小分析之Reactor pattern
- thttpd源码
- thttpd源码剖析
- thttpd.Timer.c分析
- thttpd源码解析 定时器模块
- thttpd源码解析 定时器模块
- thttpd源码解析 定时器模块
- thttpd
- Java枚举,Java泛型详解
- 漫谈程序员系列:怎样成为技术达人
- PYTHON 双引号 单引号 多引号区别
- Vim常用命令
- 黑马程序员—面向对象(1)
- thttpd源码分析
- JS使用DOM对元素进行添加和修改
- 2015年9月2日工作日志--------------赵鑫
- Android UI设计——ViewPager中设置底部显示圆点焦点(二)
- mysqlbinlog 查看mysql bin 日志
- leetcode 8: Sting to Integer (atoi)
- 黑马程序员之String,StringBuffer,StringBuider
- vim
- 欢迎使用CSDN-markdown编辑器