thttpd源代码阅读笔记

thttpd源代码阅读笔记

thttpd是一个非常小巧的轻量级web server,适合做嵌入式web服务器,它的官方网站是http://www.acme.com/software/thttpd/
thttpd的代码量很小,大约1万行代码,代码风格好像是GNU,阅读不太习惯,用indent格式化:indent -kr -i4 -l200 -bad -bap -ip8 *.c
由于我的vim将tab设置为4个空格,代码中空格与tab共用,需要把tab还原为8个空格,才不出现排版混乱。

在fedora 12下编译,有错误:
htpasswd.c:52: error: conflicting types for 'getline'
/usr/include/stdio.h:655: error: previous declaration of 'getline' was here
htpasswd.c:52: error: conflicting types for 'getline'
/usr/include/stdio.h:655: error: previous declaration of 'getline' was here
make[1]: *** [htpasswd.o] Error 1
make[1]: Leaving directory `/home/deli/work/thttpd-2.25b/extras'
make: *** [subdirs] Error 2

原因是getline 已加入 POSIX 2008,可以把extras/htpasswd.c 里面的getline重命名为get_line或别的。

代码根目录下,就这几个文件:
fdwatch.c match.c strerror.c thttpd.c
libhttpd.c mmc.c tdate_parse.c timers.c

extras子目录两个
htpasswd.c makeweb.c

main函数在 thttpd.c
先梳理一些基本知识,看代码就容易多了。

编写守护进程(daemon)遵循的一般步骤:
1. 在父进程中执行fork并执行exit退出。
2. 在子进程调用setsid。
3. 让根目录“/” 成为子进程的工作目录。
4. 把子进程的umask变为0。
5. 关闭不必要的文件描述符。

除了上面所提的步骤,thttpd.c 跟其他服务器软件一样,解析参数,信号的处理,读取配置文件等。

Apache采用多进程模型响应用户请求,thttpd对并发请求不使用 fork()来派生子进程处理,采用IO多路复用解决方案。代码在fdwatch.c/h,对select()/poll()/kqueue()进行了封装,也加上了超时处理机制,跟Android RIL串口多路服用的代码非常相似。

至于socket网络编程,对HTTP/1.1协议的支持,都在libhttpd.c里面处理。

注意到了两个文本文件 mime_encodings.txt mime_types.txt,在Makefile.in里做处理,用sed格式化,生成mime_types.h,mime_encodings.h,在libhttpd.c中 再#include 进来,这是很常见的程序设计方法,好处就是修改方便,不容易出错。

If you enjoyed this post, make sure you subscribe to my RSS feed!

Leave a Reply

Your email address will not be published. Required fields are marked *