2010-02-01 4 views
2

나는 대학을위한 약간의 교과 과정을하고 있으며, 나는 완전히 당혹 스럽다. 기본적으로 C에서 소켓을 사용하는 기본 웹 서버를 만들었습니다. 이제 모든 .php 파일이 PHP 컴파일러와 출력을 통해 실행되도록 만들었습니다.C 기반 웹 서버에서 PHP를 실행하고 출력 - Stuck!

내가 겪고있는 문제는 system()과 execlp() (후자는 강사가 추천 함)를 사용해 보았고 터미널 대신 페이지에 표시하는 방법을 찾을 수 없다는 것입니다. .

여기에 제가 현재 가지고있는 코드가 있습니다. 당신이 볼 수있는 모든 의견을 변명해라. 나는 그것이 일하기 위해 모든 종류를 시험해보고 있었다!

CODE :

if(strncmp(resource, ".php", 4)==1) { 
//cout << "test"; 

INT PHP;

int phppipefds[2], phppid; 
    char phpc; 
    pipe(phppipefds); 
    phppid = fork(); 
    if(phppid == 0) { // child will read pipe 
close(0); // close stdin 
dup2(phppipefds[0],0); // read pipe on stdin 
close(phppipefds[1]); // we dont need to write pipe 
execlp("/Applications/MAMP/bin/php5/bin/php", "php", httppath, NULL); 
cerr << "exec failed\n"; 
exit(1); 
} 
// parent, if we redirect stdout printf will send down pipe 
close(1); 
dup2(phppipefds[1],1); // write pipe on stdout 
close(phppipefds[1]); // dont need 2 write descriptors 
close(phppipefds[0]); // we dont need to read pipe 
cout << "words \ngoing \ndown \npipe \nbeing \nsorted\n"; 
close(1); // must close pipe or sort will hang 
wait(0); 

//php = system("/Applications/MAMP/bin/php5/bin/php /Users/rickymills/webserver/pages/test.php"); 
//strcat(resp,); 
//strcat(resp, php); 
} 

마지막 몇 줄은 내가이 일을하기 위해 모든 노력을 기울이는 곳입니다. 모두가 브라우저 창에 덤프

실제 부분은 바로 위의 코드 아래 :

write(connsock, resp, rd); 
exit(1); 
} 

사람이 내가 브라우저 창에이를 얻을 수있는 방법 어떤 생각을 가지고 있습니까? 나는 최선의 방법은 PHP 출력을 변수로 가져 오는 것이고, connsock이 쓰기 전에 'resp'와 결합하는 것이 올바른지 생각해봤을 까?

감사합니다.

답변

1

system() 또는 execlp() 대신 popen()을 사용해보십시오.

popen() 함수는 파이프를 작성하고 쉘을 분기하고 호출하여 프로세스를 엽니 다. 이렇게하면 PHP 출력을 터미널이 아닌 프로그램으로 리디렉션 할 수 있습니다.

char buf[BUFSIZ]; 
FILE *fp; 

if ((fp= popen("/bin/php -f /webserver/pages/test.php", "r")) != NULL) 
{ 
    /* Read from the PHP command output */ 
    while (fgets(buf, BUFSIZ, fp) != NULL) 
    { 
     /* Process the output from PHP as desired */ 
     ... 
    } 

    (void) pclose(ptr); 
} 

fclose(fp); 
관련 문제