1. 云栖社区>
  2. PHP教程>
  3. 正文

Tinyhttpd 源码阅读笔记

作者:用户 来源:互联网 时间:2017-12-01 19:37:55

阅读源码笔记Tinyhttpd

Tinyhttpd 源码阅读笔记 - 摘要: 本文讲的是Tinyhttpd 源码阅读笔记, Tinyhttpd 源码阅读笔记 Tinyhttpd是一个超轻量级的 webserver, 对于了解 HTTP 协议, web服务本质有很好的参考价值 程序流程 从 main 函数入口开始 1. 分析HTTP信息头,解释客户端传递过来的

Tinyhttpd 源码阅读笔记


Tinyhttpd是一个超轻量级的 webserver, 对于了解 HTTP 协议, web服务本质有很好的参考价值


程序流程 从 main 函数入口开始 1. 分析HTTP信息头,解释客户端传递过来的请求方法, URL, 长度等信息 2. 判断文件是否存在, 不存在则返回 not_found, 存在则判断是否为 CGI脚本 3. 假如不是 CGI 脚本,则执行 CAT 函数, 类似linux 的 cat 命令,直接显示文件文本 4. 假如是 CGI 脚本, 则分下面几步走


A 设置环境变量( 在程序里面几乎毫无用处,可能是为了执行 CGI 脚本而准备的)


B定义两个管道分别是 cgi_input (对应STDIN ), cgi_output (对应 STDOUT)


Cfork() 进子进程, 子进程把STDIN 导向到cgi_input[0], 把STDOUT 导向到cgi_output[1],execl 执行CGI 脚本,则输出到 STDOUT, 数据写入 cgi_output[1], 子进程结束, 进入父进程


D 父进程等待子进程的退出, 然后进入到父进程, 如果是 POST 方法, 把 POST 的数据写入到 cgi_input[1] 的管道(其实这个处理似乎没多大意义,本来 tinyhttpd 对于处理 POST 数据这块还不成熟, 可以忽略这个逻辑), 父进程重点逻辑主要是, 读取 cgi_output[0] 的数据, 也就是在 子进程 那里执行 CGI 脚本写入的数据, 然后 把这些数据 发送 给客户端

信息流处理过程


Tinyhttpd 源码阅读笔记

程序算法特点

利用linux管道(pipe)进行 子进程 与 父进程 之间的信息传递(也就是通常说的通信), 管道有两端, 可以看作是一个储存水的“水管”, 当水进来的时候,要先关闭水出去的一端, 当水出去的时候,要先管理水进来的一端, 实际上只是储存一个“个体完整”信息的一种方式, 通常用一个 整型数组来初始化管道, 例如:int cgi_output[2] , 0 端为读, 1 端为写


有兴趣的同学可以扩展 tinyhttpd 执行 CGI 那一段逻辑, 比如执行 PHP, 本身 php-cgi 已经做了 HTML 输出处理的, 其实假如是执行 PHP 文件,可以直接调用 php-cgi a.php 来输出HTML


源码注释的链接地址为https://github.com/r00tjimmy/tinyhttpd_note,水平有限,如有错误请见谅,留言指正,交流学习,多谢


以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索阅读 , 源码 , 笔记 Tinyhttpd ,以便于您获取更多的相关知识。