FastCGI + fork

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;

}

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs