在这篇博文中 https://blog.csdn.net/JachinYang/article/details/117329769 我们讨论了有关HTTP的基础知识,也谈到了什么是服务静态内容和服务动态内容,如果我们停下来考虑一下,就会发现一些问题,例如,客户端如何将程序参数传递给服务器?服务器如何将这些参数传递给它所创建的子进程?服务器如何将子进程生成内容所需要的其他信息传递给子进程?子进程将他的输出发送到哪里?
CGI:通用网关接口,解决上述问题。
目录
1、客户端如何将程序参数传递给服务器
GET请求的参数在URI中传递。POST请求的参数在请求主体中传递。如下是一个GET请求形式:
如上 一个" ? " 字符分割了文件名和参数,而每个参数都用一个“ & ”字符分隔开。参数中不允许有空格,而必须用字符串“ %20 ”来表示。
2、服务器如何将这些参数传递给它所创建的子进程
服务器在收到上图所示的请求后,它会调用fork函数来创建一个子进程,并调用execve在子进程的上下文中执行/cgi-bin/adder程序。像adder这样的程序,通常称之为CGI程序,因为他们遵守CGI标准的规则。在调用execve之前,子进程将CGI环境变量QUERY_STRING设置为" 1500&213 ",adder程序在运行时可以利用Linux getenv函数来引用他。
3、服务器如何给子进程将其他信息传递
CGI定义了大量的其它环境变量,一个CGI程序在它运行时可以设置这些环境变量。下面展示了其中一部分环境变量:
4、子进程将它的输出发送到哪里
一个CGI程序将它的动态内容发送到标准输出。在子进程加载并运行CGI程序之前,它使用Linux dup2函数将标准输出重定向到和客户端相关联的已连接描述符。因此,任何CGI程序写到标准输出的东西都会直接到达客户端。
注意:因为父进程不知道子进程生成的内容的类型和大小,所以子进程就要负责生成响应报头里面的Content-type和Content-length,以及终止报头的空行。
旁注:对于post请求,子进程也需要重定向标准输入到已连接描述符。然后,CGI程序会从标准输入中读取请求主体中的参数。