web后端 CGI
一、cgi的学习
cgi通用网关接口 是web服务器主机提供信息服务的标准接口。通过CGI接口,web服务器就能获取客户端提交的信息,转交给服务器端端CGI程序进行处理,最后返回结果给客户端。
服务器和CGI程序之间通过 stdin/stdout 标准输入输出来进行数据传递的
CGI工作流程:接收表单数据,进行数据处理,最后根据处理结果生成新的页面返回给浏览器。表单数据一般是以POST方法提交给服务器,由CGI程序获得,程序必须要将界面数据和内部数据对应起来才能够进行下一步的处理。CGI程序从页面获取数据就根据元素名字/值中的元素名字来进行区分。
cgi程序因为是fork+exec执行的,子进程是会复制父进程环境变量表到自己的进程空间的,所以可以读取环境变量QUERY_STRING。
每个CGI只能处理一个用户请求,因此激活一个CGI进程时也创建属于它的环境变量(开始时创建 结束时销毁)【ap2里面的原代码是这样子的,如果有需要可以修改代码】
二、cgi fork 多线程竞争
1、boa的学习
boa是单线程的服务器,官网:http://www.boa.org/
搭建步骤:https://www.cnblogs.com/eeexu123/p/5995930.html
编译错误:
1.compat.h删除##
2.boa.h #L226注视/*if (setuid(0) != -1) {}*/ 不然启动不了
2、boa并发性的理解:https://bllog.csdn.net/xumm_td/article/details/8655296
boa源码内部采用状态机来处理请求的状态。boa的业务线程是由select实现的事件驱动机制。经过实践,boa能够在处理一个cgi请求时响应其他的请求,而不是阻塞在那里死等。
cgi流程
3、解决cgi并发的问题:
解决一:
父进程等子进程结束完
waitpid
#include <sys/types.h>
#include <sys/wait.h>
解决二:
cgi加全局锁
三、测试内存泄露:
#undef malloc
lex/yacc web工具