2013-02-05 107 views
2

我正在为我的学校项目编写一个http服务器,并试图执行一个CGI脚本。下面的代码成功地执行了cgi程序,程序的输出被发送到浏览器,但是我发送POST数据的方式有些问题。下面是我得到了什么:如何执行并写入到stdin和管道stdout到套接字?

int p[2]; 
    pipe(p); 

    int pid = fork(); 

    if (pid == 0) { 
     close(p[1]); 

     dup2(p[0], STDIN_FILENO); 
     dup2(socket, STDOUT_FILENO); 

     execve(path.c_str(), {}, (char**) &env[0]); 
    } else { 
     close(p[0]); 

     string body = req->getBody(); 
     write(p[1], body.c_str(), body.size()); 

     close(socket); 
    } 

如果我理解正确的CGI我只需要设置一个HTTP_CONTENT_LENGTH环境变量(我做的),并请求主体发送到标准输入。我是否使用管道,dup2,并写出正确的方法来做到这一点?

发布到我的测试PHP脚本时,$ _POST数组为空。发布到我的测试Perl脚本时,它根本不会发送任何响应或完成运行;我认为它正在等待更多标准输入。如果我的管道和重复模块没有明显的错误,我会发布一些可以编译的测试代码来说明问题。

谢谢!

回答

0

管道和重复都可以;我的问题是我的CGI环境变量。获胜的环境变量是CONTENT_LENGTH,不以HTTP_为前缀。