源码段
if (pid == 0) /* child: CGI script */
{
char meth_env[255];
char query_env[255];
char length_env[255];
dup2(cgi_output[1], 1);
dup2(cgi_input[0], 0);
close(cgi_output[0]);
close(cgi_input[1]);
sprintf(meth_env, "REQUEST_METHOD=%s", method);
putenv(meth_env);
if (strcasecmp(method, "GET") == 0) { /* GET */
sprintf(query_env, "QUERY_STRING=%s", query_string);
putenv(query_env);
}
else { /* POST */
sprintf(length_env, "CONTENT_LENGTH=%d", content_length);
putenv(length_env);
}
execl(path, NULL);
exit(0);
}
问题
接收到执行cgi的文件时,fork出子进程设置执行cgi程序的环境变量,并且exec post请求中的文件。父进程等待子进程执行结果。
post请求行为post /color.cgi HTTP/1.0,path相应为htdocs/color.cgi, 为判断语句execv(path,NULL)是否成功,debug时更改源码如下: