Hey,
bin zur Zeit dabei eine eigene Shell zu schreiben.
Hänge im Moment ein bisschen bei den Pipes:
Das grundlegende Modell der Shell sieht so aus, dass erstmal der Befehl eingelesen wird und dann in einer 2dimensionalen Liste gespeichert wird.
In etwa so:
Also praktisch eine Liste mit Knoten für die Kommandos und jeder Knoten hat noch eine Liste mit Argumenten.
Am Ende wird die Liste dann abgearbeitet.
Ein Befehl wie
geht auch durch. Allerdings unterstützt die Shell bislang nur eine Pipe.
Das ganze läuft bislang so:
Wenn beim Durchlaufen der Liste eine Pipe erkannt wird, dann wird folgende Funktion mit dem Knoten vor der Pipe und dem Knoten hinter der Pipe aufgerufen:
Das läuft auch soweit alles, allerdings weiß ich nicht genau wie man unendlich viele Pipes umsetzen soll. Ich befürchte dafür muss man eine komplett neue Funktion schreiben bzw irgendwie rekursiv aufrufen?
Vllt hat jemand eine Idee, wie man das am besten umsetzt.
Grüße
bin zur Zeit dabei eine eigene Shell zu schreiben.
Hänge im Moment ein bisschen bei den Pipes:
Das grundlegende Modell der Shell sieht so aus, dass erstmal der Befehl eingelesen wird und dann in einer 2dimensionalen Liste gespeichert wird.
In etwa so:
Also praktisch eine Liste mit Knoten für die Kommandos und jeder Knoten hat noch eine Liste mit Argumenten.
Am Ende wird die Liste dann abgearbeitet.
Ein Befehl wie
Code:
ls -l | grep Test
Das ganze läuft bislang so:
Wenn beim Durchlaufen der Liste eine Pipe erkannt wird, dann wird folgende Funktion mit dem Knoten vor der Pipe und dem Knoten hinter der Pipe aufgerufen:
Code:
int pipeCommand(struct node_cmd *first, struct node_cmd *second) {
struct node_arg *tempArg = first->args->start;
char *args[first->args->length + 1];
//Array mit den Argumenten aus der args-Liste wird erzeugt.
struct node_arg *tempArg2 = second->args->start;
char *args2[second->args->length + 1];
//Array mit den Argumenten aus der args-Liste wird erzeugt.
int pipefd[2];
if (pipe(pipefd) == -1) {
printf("Creating pipe failed\n");
return -1;
}
if (fork() == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
return execv(args[0], args);
}
if (fork() == 0) {
close(pipefd[1]);
dup2(pipefd[0], 0);
return execv(args2[0], args2);
}
close(pipefd[0]);
close(pipefd[1]);
while (wait(NULL) >= 0)
;
}
Vllt hat jemand eine Idee, wie man das am besten umsetzt.
Grüße