2017-04-21 4 views
0

Ich schreibe eine Funktion in meiner Shell, wo ich Ausgabe in Datei umleiten muss. Zum Beispiel Benutzer schreiben: ls -l >> file und ls -l sollte in die Datei geschrieben werden. Fast alle Dinge sind korrekt, aber nach dem ersten Aufruf meines Funktionsprogramms stoppe ich und kann nichts anderes mehr schreiben. Im Folgenden werde ich meine Funktion vorstellen und ich würde irgendwelche Hinweise zu schätzen wissen, das Problem zu beheben:Benutzerdefinierte Shell funktioniert nicht mehr nach dup2

void execute2(char *command, char **argv, char **argv2) 
{ 
    pid_t pid; 
    int status; 

    if ((pid = fork()) < 0) 
    {  
     printf("*** ERROR ***\n"); 
      exit(1); 
    } 
    else if (pid == 0) 
    {  
     close(1);  
     parse(command, argv, argv2); 
     int output = open(*argv2, O_APPEND | O_WRONLY); 
     dup2(output,1);  
     if (strcmp(argv[0], "exit") == 0) 
      exit(0);  
     if (execvp(*argv, argv) < 0) 
     {  
      printf("*** ERROR ***\n"); 
      exit(1); 
     } 
     close(output); 
    } 
    else 
    {         
     while (wait(&status) != pid); 
    } 
} 

command ist Befehl vom Benutzer bekommen, argv Teil des Unterrichts und der Parameter ist und argv2 die Ausgabedatei ist.

+1

Sie sollten 'nach' dup2 (output, 1) 'und vor' execvp() '' schließen (ausgeben) '- vorzugsweise auch vor' strcmp() '. Es besteht keine Notwendigkeit, den Rückgabewert von 'execvp()' zu testen; Es wird nur zurückgegeben, wenn es fehlschlägt. –

+1

Wenn Sie das Kind irgendwie sterben verpassen, dreht sich Ihre Warteschleife für immer. Erfassen und drucken Sie die Prozess-ID und den Status für das Debugging. Für Robustheit; benutze 'int Leiche; Int-Status; while ((leichen = warten (& status))! = -1 && leichen! = pid) printf ("Kind% d mit Status 0x.4X \ n", Leiche, Status); '. Auch das ist nicht perfekt; es ignoriert die Möglichkeit, dass ein Signal bearbeitet wird und "wait()' '-1' mit' errno == EINTR' zurückgibt. Auf diese Weise werden Sie wissen, was vor sich geht. –

+0

Welchen Befehl rufst du an? Wenn Sie "ls" aufrufen, scheint es, dass dies zurückkehren sollte. Wenn Sie 'cat' oder irgendwas anderes aufrufen, das bei einem Lesevorgang von stdin blockiert, würde ich erwarten, dass es läuft, bis Sie ihm ein Signal senden. –

Antwort

-2

@ Jonathan Leffler Ich habe das überprüft und ich denke, es löst das Problem nicht. Ich schlage vor, dass, wenn ich das erste Mal execute2 anrufe, es so gut funktioniert, wie ich will, aber ich beende diesen Prozess nie. Oder ich entziehe etwas nicht

+0

Dies liefert keine Antwort auf die Frage. Sie können [ähnliche Fragen suchen] (http://stackoverflow.com/search) oder auf die verwandten und verknüpften Fragen auf der rechten Seite der Seite verweisen, um eine Antwort zu finden. Wenn Sie eine verwandte, aber andere Frage haben, [stellen Sie eine neue Frage] (// stackoverflow.com/questions/ask), und fügen Sie einen Link zu diesem ein, um den Kontext zu verdeutlichen. Siehe: [Fragen stellen, Antworten erhalten, keine Ablenkungen] (http://stackoverflow.com/tour) – Krease

Verwandte Themen