2013-02-05 42 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_爲前綴。