2011-03-12 3 views
4

쉘 명령을 인수로 사용하고 fork를 사용하여 명령을 실행하는 새 프로세스를 생성하는 함수를 작성하려고합니다. 또한 함수의 호출자가 FILE * 포인터를 사용하여 읽을 수 있도록 명령의 표준 출력을 리디렉션하려고합니다.쉘 명령 실행 및 C 프로그램에서 출력 읽기

static FILE* runCommand(char* command){ 
    int pfd[2]; 

    if(pipe(pfd)<0)  
     return NULL; 

    if(pid=fork()==0){ //child 
     close(pfd[0]); 
     dup2(pfd[1],1); //redirect output to pipe for writing 

     execlp(command,(char*)0); 
    } 

    close(pfd[1]); 

    //return a file pointer/descriptor here? 

}

나는 명령의 출력을 읽는 데 사용할 수있는 파일 포인터를 반환하는 방법을 잘 모르겠습니다. 또한 쉘에서 명령을 실행하는 올바른 방법입니까?

ps. popen에 대해 읽었지 만 사용할 수없는 좋은 이유가 있으므로 직접이 기능을 구현해야합니다.

FILE * 개체와 기존의 파일 기술자를 연결하는 당신에게

+0

popen이 malloc을 호출하는 것 같습니다 (필자는 malloc을 오버라이드 (override) 한 원인을 볼 수 있습니다). 그것은 내 프로젝트를 복잡하게 만듭니다. 그래서 나는 popen을 부르지 않는 것을 좋아합니다. – SpotsWood

답변

4

해당 코드의 버그 중 하나는 어디에도 선언되지 않은 변수 pid에 할당한다는 것입니다. 작성된 코드는 (pid=fork())==0이 아닌 pid=(fork()==0)과 같기 때문에 pid는 항상 부모에서 1입니다.

또한 dup2 호출 후 pfd [1]을 닫아야합니다. 그리고 좋은 측정을 위해 dup2와 execlp에서 오류를 확인하십시오.

실제 질문에 대한 답변은 fdopen입니다.

1

사용 fdopen 감사드립니다. 다른 모든 것들이 꽤 좋아 보인다.