시스템 프로그래밍 클래스 용 셸에서 작업하고 있습니다. 파일 리디렉션에 문제가 있습니다. 출력을 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);
}
}