18.2.8 SHTTPD支持CGI的分析设计
Web服务器中的CGI是一段外部程序,它可以动态地生成代码,并可以接收输入的参数。支持CGI主要分为如下几个部分:
q CGI运行程序和输入参数的分析;
q 一个进程运行CGI程序,将CGI程序的输出发给与客户端通信的进程;
q 与客户端通信的进程生成头部信息,并将CGI运行进程的输出发给客户端。
CGI程序及参数的分析用于得到CGI程序和CGI程序运行时的输入参数。例如对于一个请求http://localhost/add?a+b,在服务器端运行的CGI程序为add,参数为a和b,用于计算a、b之和。
一个完整的CGI程序执行过程如图18.12所示。在分析CGI程序和参数之后,需要建立进程间通信管道,便于执行CGI程序时接收CGI程序结果。然后进程分叉,主进程负责与客户端进行通信,先分析得到头部信息,然后与CGI执行程序进程通信,读取CGI执行的结果,最后关闭进程后退出。
执行CGI程序是一个相对来说比较复杂的设计,采用进程间的管道通信方式,来获得CGI程序的输出并发送到客户端。CGI执行程序的输出为标注输出,为了在主进程中能够获得CGI执行进程的CGI输出,这里采用了进程间的管道通信方式并使用了文件描述符的复制操作,将CGI执行进程中管道的一端与标准输出绑定起来,CGI程序的输出数据会进行管道,主程序可以在另一端接收到CGI执行结果在标准输出的结果。
如图18.13所示,构建CGI执行程序的过程主要分为如下步骤:
(1)建立管道。
(2)进程分叉,分为主进程和CGI进程,主进程负责与客户端通信,CGI进程负责执行CGI程序。
在主进程中:
(s.1)关闭输入管道的写端,留下读端,这个管道另一端在CGI进程中与CGI的标准输出绑定在一起。
(s.2)从管道中读取数据。
(s.3)将数据发送到客户端。
(s.4)如果数据结束等待CGI进程结束。
图18.12 CGI程序的执行过程
在CGI进程中:
(c.1)关闭管道的读端,留下写端,这个管道与主进程中管道的读端相连,用于将CGI执行结果发送给主进程。
(c.2)将此管道的写端与进程的标准输出绑定在一起。
(c.3)关闭写管道。
图18.13 CGI进程构建过程
(3)执行程序。
具体的管道构建过程如图18.14所示。