2017-02-10 18 views
-1

이 코드는 2 개의 파일을 가져 와서 결과를 세 번째 파일로 저장합니다. 이렇게해도 문제가되지 않지만 마지막 printf는 화면에 인쇄되지 않습니다. 첫 번째는 잘 인쇄됩니다. 이것은 stdout을 올바르게 복원하지 못했음을 나타냅니다.stdout을 다시 얻지 못함

int main (int argc, char *argv[]) 
{ 
    char *join[4]={"cat", "file1.txt","file2.txt", 0}; 
    int id, fd, status; 

    printf("fd=%d\n", fd); //this one prints to screen 

    fd=dup(1); //save stdout 
    close(1); close stdout 

    FILE *out=fopen("output.c", "a"); //this is where the output should go 

    id=fork(); //0 for child 

    if (id>0) //parent process 
    { 
     waitpid(id, &status, WUNTRACED); 
    } 

    else if (id==0) //child process 
    { 
     execvp(join[0], join); 
    } 

    else //error 
    { 
     printf("error occured"); 
    } 


    close(1); 
    dup2(fd, 1); 
    fclose(out); 


    printf("fd=%d\n", fd); //this one doesn't print to screen 


return 0; 

} 
+1

'fd'는 절대로 값이 주어지지 않으므로, 정의되지 않은 값을 fileid에 넣을 것입니다. 닫은 후에는 원래 stdout을 복원하려고하지 않으므로 왜 마술처럼 작동 할 것이라고 기대합니까? – John3136

+0

골격 코드에 중요한 단계가 많이 빠져 있습니다. MCVE ([MCVE])가 아니지만, 우리가 할 일은 당신이 무엇을하고 있는지를 확인하고 공백을 채울 수 있습니다. 우리가 수행하지 않은 것에 대해 추측하고 찡그린다면 (예를 들어'fd'를 초기화하거나 의미가 무엇인지 궁금해 할 때) 가장 좋은 방법입니다. –

+0

죄송합니다. 아직 새로운 소식입니다. 나는 약간의 편집을했고 여전히 두 번째 print 문을 보지 못했고 이제 터미널에 무엇을 입력하는지 볼 수 없습니다. 나는'dup2 (fd, 1)'로 출력을 복원했다고 생각 했는가? –

답변

3

stdout을 저장해야 나중에 다시 볼 수 있습니다.

// save stdout 
int sv_stdout = dup(STDOUT_FILENO); 
// close stdout 
close(STDOUT_FILENO); 

// do stuff 

// restore stdout 
dup2(sv_stdout, STDOUT_FILENO); 
0

execvp 결코 반환하지 않습니다. 프로세스가 cat 프로세스로 대체되었습니다. 프로세스가 종료되면 쉘 프롬프트가 다시 나타납니다. exec에 대한 man 페이지를 참조하십시오. 여러 프로세스를 실행하는 방법을 보려면 Google의 fork/exec의 예를 참조하십시오. 또는이 작업을 수행하는 system()을 사용하십시오.