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






