2016-08-20 17 views
1

실습으로 쉘을 만들고 있지만 문제가 있습니다. 거의 모든 명령은 "cd"를 제외하고는 잘 작동합니다. 왜 이런 일이 일어나는지 알 수 없습니다. 그것은 자식 프로세스의 작업 디렉토리를 변경하는 것 같다 부모 프로세스에 영향을 미치는되지 않으며, 따라서 그 효과는 쉘에서 만들었 었지되지C로 리눅스 쉘 구현하기

int main(int argk, char *argv[], char *envp[]) 
{ 
    int    frkRtnVal; 
    char   *v[NV]; 
    char   *sep = " \t\n"; 
    int    i;  

    while (1) 
    { 
     fgets(line, NL, stdin); 
     fflush(stdin); 

     if (feof(stdin)) 
     { 
      fprintf(stderr, "EOF pid %d feof %d ferror %d\n", getpid(), feof(stdin), ferror(stdin)); 
      exit(0); 
     } 

     if (line[0] == '#' || line[0] == '\n' || line[0] == '\000') 
     { 
      continue; 
     } 

     v[0] = strtok(line, sep); 
     for (i = 1; i < NV; i++) 
     { 
      v[i] = strtok(NULL, sep); 
      if (v[i] == NULL) 
      { 
       break; 
      } 
     } 

     frkRtnVal = fork(); 
     switch (frkRtnVal) 
     { 
      case -1: 
      { 
       break; 
      } 
      case 0: 
      { 
       execvp(v[0], v); 
      } 
      default:    
      { 
       wait(0); 
       break; 
      } 
     } 
    } 
} 
+0

문제는'cd'를 포크하고 exec 할 수 없다는 것입니다; 이것은 쉘이'chdir()'시스템 호출 자체를 실행해야하기 때문에 내장 된 쉘입니다. (예를 들어, Mac OS X에서는'/ usr/bin/cd '가 있습니다.) 그러나 디렉토리를 변경 한 후 자식 쉘이 즉시 종료되기 때문에 아무 일도하지 않습니다. 어쨌든 주 쉘의 디렉토리를 바 꾸었습니다.) –

+0

'cd'는 적어도 전통적인 의미에서는 프로그램이 아니기 때문에이 문제가 발생합니다. 'cd'는 쉘 내장 명령입니다 (자세한 내용은'man builtin' 또는'man cd'를 입력하십시오). 이는'cd '와 다른 쉘 내장 로직이 쉘 프로그램에 내장된다는 것을 의미하며, 이는 포크에 의해 호출되고 포킹과 실행의 전통적인 프로세스를 통해 쉘에 의해 호출되는 외부 프로그램이되는 것을 의미합니다. 이것은'/ bin'에'cd' 프로그램이 없다는 것을 보아서 확인할 수 있습니다. – user3282276

+0

(초기 복제본은 충분히주의 깊게 읽지 않았으며 디렉토리 이름의 일부로 줄 바꾸기 문제가 발생 했음에도 불구하고 이에 대한 적절한 복제본이 하나 이상 있습니다.) –

답변

4

:

여기 내 코드입니다. 셸에서 구문 분석하고 특수 명령으로 처리해야합니다.

관련 문제