【问题标题】:How can I exec and write to stdin and pipe stdout to a socket?如何执行并写入标准输入并将标准输出通过管道传输到套接字?
【发布时间】:2013-02-05 20:42:30
【问题描述】:

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

    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 环境变量(我正在这样做)并将请求正文发送到标准输入。我是否使用 pipe、dup2 并编写了正确的方法来做到这一点?

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

谢谢!

【问题讨论】:

    标签: c++ c cgi pipe dup2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多