我如何执行和写入stdin和管道标准输出到套接字?

时间:2013-02-05 20:42:30

标签: c++ c cgi pipe dup2

我正在为我的学校项目编写一个http服务器,我正在尝试执行CGI脚本。下面的代码成功执行了cgi程序,程序的输出被发送到浏览器,但是我发送POSTed数据的方式有问题。这就是我所拥有的:

    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环境变量(我正在做)并将请求体发送给stdin。我使用pipe,dup2,并写出正确的方法吗?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

管道和复制都没问题;我的问题是我的CGI环境变量。获胜环境变量为CONTENT_LENGTH,不以HTTP _。为前缀。