PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pipe implementierung funktioniert nicht..



Sternenjaeger
19.12.2006, 11:07
Hallo :)

ich habe ein "kleines" Problem, und zwar:

wir haben fuer die Hausuebung eine kleine shell vorgegeben bekommen, die wir um eine Pipe Bearbeitung erweitern sollten.

Leider funktioniert meine Pipe ueberhaupt nicht der erste Befehl wird noch ausgefuehrt, dann bricht sie ab.. und ich finde den Fehler einfach nicht. :(

(abgabe ist morgen.. args *G*)
der code:



int pipe_aufruf(Kommando k){
int sequenz_laenge = listeLaenge(k->sequenz.liste);
int fildes[2], pipe_status, P_Anfang, P_Mitte, P_Ende;
Liste liste;
Kommando kn;
pipe_status = pipe(fildes);
if(pipe_status==-1){perror("Pipe konnte nicht erzeugt werden\n");
exit(1);
}

for (int i = 1; i <= sequenz_laenge; i++){
if(i==1){
switch(P_Anfang = fork()){
case -1 : perror("fork nicht erfolgreich");
return 0;
//Kind liest aus Pipe, der Eingang wird geschlossen
case 0 : close(fildes[1]);
if(dup2(fildes[0],0) < 0 ){
perror("dup2 bei P Anfang fork nicht erfolgreich");
return 0;
}
kn = (Kommando)listeKopf(k->sequenz.liste);
programmaufruf(kn->einfach.wortanzahl, kn->einfach.worte);

//Mutter schreibt in die Pipe
default: close(fildes[0]);
if(dup2(fildes[1], 1)<0){
perror("Fehler bei Dup2 bei P_Anfang default\n");
exit(1);
}
kn = (Kommando)listeKopf(k->sequenz.liste);
programmaufruf(kn->einfach.wortanzahl, kn->einfach.worte);
}
}
else if(i==sequenz_laenge){
switch(P_Ende = fork()){
case -1 : perror("fork nicht erfolgreich");
return 0;
case 0 : close(fildes[1]);
if(dup2(fildes[0],0)<0){
perror("Fehler bei dup2 bei P_Ende\n");
return 0;
}
liste = k->sequenz.liste;
for (int i = 1; i < sequenz_laenge; i++){
liste = listeRest(liste);
}
kn = (Kommando)listeKopf(liste);
programmaufruf(kn->einfach.wortanzahl, kn->einfach.worte);

default: close(fildes[0]);
if(dup2(fildes[1], 1)<0){perror("Fehler bei Dup2 bei P_Ende default\n");}
liste = k->sequenz.liste;
for (int i = 1; i < sequenz_laenge; i++){
liste = listeRest(liste);
}
kn = (Kommando)listeKopf(liste);
programmaufruf(kn->einfach.wortanzahl, kn->einfach.worte);
}
}
else{
switch(P_Mitte = fork()){
case -1 : perror("fork bei P_Mitte nicht erfolgreich");
return 0;
case 0 : close(fildes[1]);
if(dup2(fildes[0],0)<0){
perror("dup2 bei P_Ednde fork nicht erfolgreich\n");
return 0;
}
liste = k->sequenz.liste;
for (int j = 1; i < j; j++){
liste = listeRest(liste);
}
kn = (Kommando)listeKopf(liste);
programmaufruf(kn->einfach.wortanzahl, kn->einfach.worte);
default: close(fildes[0]);
if(dup2(fildes[1], 1)<0){perror("Fehler bei Dup2 bei P_Ende default\n");}
liste = k->sequenz.liste;
for (int j = 1; i < j; j++){
liste = listeRest(liste);
}
kn = (Kommando)listeKopf(liste);
programmaufruf(kn->einfach.wortanzahl, kn->einfach.worte);
}
}
}
return 0;
}

Wolfgang
19.12.2006, 11:44
Hallo

Von welcher Scriptsprache ist die Rede?
Das schaut weder nach bash, ksh noch csh aus. ;)

Gruß Wolfgang

Sternenjaeger
19.12.2006, 14:03
ups.... falsches unterforum erwischt
*schaem*
*das richtige suchen geht*:search:


(dank der Hilfe des Profs ist der Fehler auch mehr oder weniger behoben :) *dezent die Compilerfehlermeldung wegshciebt*

Wolfgang
19.12.2006, 14:33
Ok, dachte ich mir schon.
(dezent verschieb) ;)
Gruß Wolfgang