Shell -> Pipes

04/30/2015 17:36 Belur#1
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
Code:
ls -l | grep Test
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:

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)
		;
}
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