2014-01-21 5 views
0

내 가상 쉘에서 호출 할 수 있도록 호출 함수를 코딩하려고하는데 단순한 (하나의 명령) 및 파이프 케이스가 작동하는 동안 리디렉션을 시도하면 나에게 파일 디스크립터가 잘못되었다는 쓰기 오류. argv []는 첫 번째 명령의 이름과 매개 변수를 포함하고 argv []는 두 번째 명령과 동일합니다.명령의 출력을 파일로 리디렉션하는 동안 파일 설명 자의 오류가 발생했습니다.

다음
char *argv[2][3]; 
argv[0][0]="ls"; 
argv[0][1]="-l"; 
argv[0][2]=NULL; 
argv[1][0]="test"; 
argv[1][1]=NULL; 
pid=invoke(argv[0],argv[1],_REDIRECT); 

, 내가 무엇을 할 수 :

int invoke(char *argv1[], char *argv2[], type_c tipo) 
{ 
    int pid, pfd[2], fid; 

    switch(tipo) 
    { 
    case(_SIMPLE): 
     pid=fork(); 
     switch(pid) { 
     case 0: 
      execvp(argv1[0],argv1); 
     } 
     break; 
    case(_PIPE): 
     pipe(pfd); 
     pid=fork(); 
     switch(pid) { 
     case 0: 
      close(1); 
      dup(pfd[1]); 
      close(pfd[0]); 
      close(pfd[1]); 
      execvp(argv1[0],argv1); 
     } 
     pid=fork(); 
     switch(pid) { 
     case 0: 
      close(0); 
      dup(pfd[0]); 
      close(pfd[0]); 
      close(pfd[1]); 
      execvp(argv2[0],argv2); 
     } 
     close(pfd[0]); 
     close(pfd[1]); 
     break; 
    case(_REDIRECT): 
     pid=fork(); 
     switch(pid) { 
     case 0: 
      close(fileno(stdout)); 
      fid=open(argv2[0],O_CREAT|O_WRONLY); 
      dup(fid); 
      close(fid); 
      execvp(argv1[0],argv1); 
     } 
     break;   
     } 
     return pid; 
    } 

주() 함수에서, 그것을 테스트, 나는이 코드를 작성? : _REDIRECT의 경우 사전

답변

0

의 모든/고맙습니다,

  • 먼저 표준 출력을 닫는. 이는 무료 파일 설명자 1이 있음을 의미합니다.
  • 이제 명령 출력을 보내려는 file을 열려고합니다. 이는 설명자 번호 1에서 직접 열립니다.
  • 그러면이 새로운 파일 설명자를 3 (2stderror)에 열리는이 새로운 파일 설명자를 dup이라고합니다.
  • 이제 fid은 이전에 1에 있었던 것입니다. ls 프로그램은 따라서 그것을 만들고,이 경우 이미 폐쇄 된 FD 1에 인쇄 할 수 bad-file descriptor.

이 문제를 해결하는 방법은 두 가지가 있습니다.

dup을 추가 할 필요가 없으며 코드가 완벽하게 작동합니다.

close(fileno(stdout)); 
int fid=open(argv2[0],O_CREAT|O_WRONLY); 
execvp(argv1[0],argv1); 

는 암시 적으로 target fd을 닫고 그것을 우리 fd의 사본을 만들어 다른 함수 dup2은,이 우리의 인생을 더 쉽게합니다.

int fid=open(argv2[0],O_CREAT|O_WRONLY); 
dup2(fid,1); 
close(fid); 
execvp(argv1[0],argv1); 
+0

감사합니다. 그것은 작동합니다! (나는 의심의 여지가 없어, 여기 stackoverflow에서 모두 천재입니다!) – user3219457