S
Sternenjaeger
Grünschnabel
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:
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;
}