2011-10-05 4 views
0

시스템 프로그래밍 클래스 용 셸에서 작업하고 있습니다. 파일 리디렉션에 문제가 있습니다. 출력을 e.x로 리디렉션했습니다. "ls> a"그러나 "cat < a"와 같은 명령을 입력하면 쉘의 모든 파일이 삭제됩니다. 문제가 두 번째 if 문에서 비롯된 것 같습니다. "fdin = open (_inputFile, 777)"셸 빌드 - IO 문제

그렇다면 권장 튜토리얼/다른 예제에 대한 링크를 많이 읽으십시오.

참고로 필자는 전체 기능을 포함했지만 파이프를 만드는 시점에서 아직 테스트하지 않았습니다. 나는 그것이 제대로 작동하지만, 그것은 다른 파일에서 실수 일 수 있다고 생각하지 않습니다.

void Command:: execute(){

if(_numberOfSimpleCommands == 0){ 

    prompt(); 
     return; 
    } 

    //save input/output 
    int defaultin = dup(0); 
    int defaultout = dup(1); 

    //initial input 
    int fdin; 
    if(_inputFile){ 
     fdin = open(_inputFile,0777); 
    }else{ 
     //use default input 
     fdin = dup(defaultin); 
    } 

    //execution 
    int pid; 
    int fdout; 
    for(int i = 0; i < _numberOfSimpleCommands; i++){ 
     dup2(fdin,0); 
     close(fdin); 

     //setoutput 
     if(i == _numberOfSimpleCommands -1){ 
      if(_outFile){ 
       fdout = creat(_outFile,0666); 
      }else{ 
       fdout = dup(defaultout); 
      } 
     }else{ 
      int fdpipe[2]; 
      pipe(fdpipe); 
      fdout = fdpipe[0]; 
      fdin = fdpipe[1]; 
     } 
     dup2(fdout,1); 
     close(fdout); 

     //create child 
     pid = fork(); 
     if(pid == 0){ 
      execvp(_simpleCommands[0]->_arguments[0],_simpleCommands[0]->_arguments); 
      perror("-myshell"); 
      _exit(1); 
     } 
    } 
    //restore IO defaults 
    dup2(defaultin,0); 
    dup2(defaultout,1); 
    close(defaultin); 
    close(defaultout); 

    if(!_background){ 
     waitpid(pid,0,0); 
    } 
} 

답변

1

귀하의 전화 open(_inputFile, 0777)이 올바르지 않습니다. open의 두 번째 인수는 액세스 모드와 파일 생성 플래그를 지정하는 비트 또는 비트 조합 (O_RDONLY, O_WRONLY 등)을 포함해야합니다. 0777을 전달하기 때문에 O_CREATO_TRUNC이 모두 포함되어 결국 _inputFile이 지워집니다. 아마도 open(_inputFile, O_RDONLY)을 원할 것입니다.