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.
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. –
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. –
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. –