Hi there,

I rewrote FastCGI's echo_cpp.cpp example to ridirect another process e.g. ls output DIRECTLY (to achieve high performance) to client but unfortunately does not work as expected!

P.S. if I simply read the pipe I get output but I lost performance. So, I need to directly redirect the output to client without any copying streams!

P.S. if I replace fork saffs with just a simple cout<<, I can see the output.

Anyone has any idea about how to correct it? I worked so hard with no success.

#include <stdlib.h>
#ifdef _WIN32
#include <process.h>
#else
#include <unistd.h>
extern char ** environ;
#endif
#include "fcgio.h"
#include "fcgi_config.h"  // HAVE_IOSTREAM_WITHASSIGN_STREAMBUF

//my includes
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

using namespace std;

int main (void)
{
    streambuf * cin_streambuf  = cin.rdbuf();
    streambuf * cout_streambuf = cout.rdbuf();
    streambuf * cerr_streambuf = cerr.rdbuf();

    FCGX_Request request;

    FCGX_Init();
    FCGX_InitRequest(&request, 0, 0);

    while (FCGX_Accept_r(&request) == 0)
    {
        fcgi_streambuf cin_fcgi_streambuf(request.in);
        fcgi_streambuf cout_fcgi_streambuf(request.out);
        fcgi_streambuf cerr_fcgi_streambuf(request.err);

#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
        cin  = &cin_fcgi_streambuf;
        cout = &cout_fcgi_streambuf;
        cerr = &cerr_fcgi_streambuf;
#else
        cin.rdbuf(&cin_fcgi_streambuf);
        cout.rdbuf(&cout_fcgi_streambuf);
        cerr.rdbuf(&cerr_fcgi_streambuf);
#endif

        cout << "Content-type: text/html\r\n"
                "\r\n";

        cout.flush();

        int pipe_fd[2];
        pipe(pipe_fd);
        close(STDOUT_FILENO);
        dup2(pipe_fd[0], STDOUT_FILENO);// redirecting pipe read side to stdout

        int fid = fork();
        if(0==fid)
        {
//here we are in child prcess!
                close(STDOUT_FILENO);
                dup2(pipe_fd[1],STDOUT_FILENO);//redirecting pipe write side to 
stdout

                system("ls -l ./");
                close(pipe_fd[1]);
                return 0;
        }
        wait(0);//waiting for child process in parent
    }

#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
    cin  = cin_streambuf;
    cout = cout_streambuf;
    cerr = cerr_streambuf;
#else
    cin.rdbuf(cin_streambuf);
    cout.rdbuf(cout_streambuf);
    cerr.rdbuf(cerr_streambuf);
#endif

    return 0;
}

_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Reply via email to