2016-08-20 4 views
1

Ich mache eine Shell als Übung, aber ich bin ziemlich mit einem Problem kämpfen. Fast alle Befehle funktionieren gut, außer "cd". Ich kann nicht herausfinden, warum das passiert.Implement Linux Shell in C

Hier ist mein Code:

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

Das Problem ist, dass Sie nicht fork und exec 'cd' können; Es ist eine eingebaute Shell, da die Shell den Systemaufruf 'chdir()' selbst ausführen muss. (Genauer gesagt, Sie können forcieren und 'cd' ausführen (unter Mac OS X gibt es ein'/usr/bin/cd'), aber es tut nichts, weil die Kind-Shell sofort nach dem Ändern des Verzeichnisses und hasn beendet wird hab das Verzeichnis der Haupt-Shell sowieso nicht geändert.) –

+0

Du kommst auf dieses Problem, weil 'cd' kein Programm ist, zumindest nicht im traditionellen Sinne. 'cd' ist ein eingebauter Shell-Befehl (geben Sie' man builtin' oder 'man cd' ein, um mehr zu erfahren). Das bedeutet, dass die Logik für "cd" und die anderen eingebauten Shells in das Shell-Programm integriert sind, anstatt ein externes Programm zu sein, das von der Shell durch den traditionellen Forking- und Executing-Prozess aufgerufen wird. Dies kann verifiziert werden, wenn in '/ bin' kein' CD'-Programm vorhanden ist. – user3282276

+0

(Anfangsduplikat wurde nicht sorgfältig genug gelesen; das Problem war Newline als Teil des Verzeichnisnamens. Trotzdem gibt es auf SO mindestens ein geeignetes Duplikat.) –

Antwort

4

Es Arbeitsverzeichnis in untergeordnetem Prozess scheint nicht ändert den übergeordneten Prozess zu beeinflussen und damit seine Wirkung in der Schale nicht holded. Sie müssen es in der Shell analysieren und als speziellen Befehl behandeln.