Pipe ind Shell
-
Hallo Leute, ich muss in der Shell eine Pipe-Funktionalität implementieren..
Kann mir jemand sagen was die Eins in der fett-markierten Zeile bedeutet?
Vielen Dank im Voraus!!Aufgabenstellung lautet:
"D.h. in der Kommandozeile sollen dann auch zwei durch eine Pipe verbundene Kommandos eingegeben werden können, wobei der erste Prozess die Eingabe für den zweiten liefert. Gekennzeichnet wird eine solche Pipe durch das auch von der bash her bekannte Symbol ‚|’."Beispiel: ls –als | more
hier der Code dazu:
/******************************************************************/
**void isPipe(char *cmd) {
**
// pipeConnection[0] -> LeseDeskriptor
// pipeConnection[1] -> SchreibDeskriptor
int pipeConnection[2];char *inp[2];
char *ptr, string1[100], string2[100];
int i=1,j;ptr = strtok(cmd,"|");
inp[0] = ptr;
ptr = strtok(NULL,"|");
if (ptr == NULL) {
handleCmd(inp[0],0,NULL);
}
else {
inp[1] = ptr;
inp[1] = inp[1]+1; /* ?????????????? */printf("pipePre: %s\n",inp[0]);
printf("pipeAft: %s\n",inp[1]);// Rueckgabe 0, wenn erfolgreich
if(pipe(pipeConnection)) {
printf("Fehler, pipe konnte niche geoeffnet werden\n");
exit(0);
}// 1. Aufruf Kindprozess schreibproz pipeCon[1]
handleCmd(inp[0],1,pipeConnection);// 2. Aufruf Kindprozess lesebproz pipeCon[0]
handleCmd(inp[1],-1,pipeConnection);
}
}
-
Wenn ich es richtig verstehe, ist inp[1] ein pointer. Der wird dann in der fett gedruckten Zeile um 1 inkrementiert...
-
ptr = strtok(cmd,"|"); // initialisier strtok inp[0] = ptr; // speichere ersten Kommando ptr = strtok(NULL,"|"); // suche noch ein Kommando... if (ptr == NULL) { // wenn nur ein Kommando handleCmd(inp[0],0,NULL); // gleich ausführen } else { // wenn noch ein zweiter Kommando inp[1] = ptr; // speichere auch zweiten Kommando inp[1] = inp[1]+1; /* ?????????????? */ // "entferne" das führende ' ' des zweiten Kommandos, welches '|' und Kommando trennt
Das nur meine Vermutung. Ich glaube eine Pipe ohne folgendes Leerzeichen ist unzulässig.
Strtok liefert dir den Zeiger auf das Zeichen nach '|', welches in deinem Beispiel ein ' '(<-Edit: Leerzeichen) sein muss. In diesem Leerzeichen liegt eigentlich kein Informationsgehalt und kann übergangen werden(inp[1]+1).