Die Sache ist folgende:
Die EOF bedingung wird nur dann ausgelöst, wenn der andere Teil der Pipe bereits zu ist.
Also habe ich vor die while schleife mit dem read drin einfach close(p[1]); geschrieben und schon sorgt ein close auf der anderen seite dafür, dass die komplette pipe dicht ist und die eof bedingung wird ausgelöst.
folgendes funktioniert nun also:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int child1(){
close(p[0]);
while(fgets(eab, sizeof(eab), stdin)!=NULL)
write(p[1], eab, sizeof(eab));
close(p[1]);
return 0;
}
int parent(){
close(p[1]); //Ohne das Close hier gehts nicht!!!
while(read(p[0], eab, sizeof(eab))!=0)
printf("%s\n", eab);
return 0;
wait(NULL);
wait(NULL);
}
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int child1(){
close(p[0]);
while(fgets(eab, sizeof(eab), stdin)!=NULL)
write(p[1], eab, sizeof(eab));
close(p[1]);
return 0;
}
int parent(){
close(p[1]); //Ohne das Close hier gehts nicht!!!
while(read(p[0], eab, sizeof(eab))!=0)
printf("%s\n", eab);
return 0;
wait(NULL);
wait(NULL);
}
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int child1(){
close(p[0]);
while(fgets(eab, sizeof(eab), stdin)!=NULL)
write(p[1], eab, sizeof(eab));
close(p[1]);
return 0;
}
int parent(){
close(p[1]); //Ohne das Close hier gehts nicht!!!
while(read(p[0], eab, sizeof(eab))!=0)
printf("%s\n", eab);
return 0;
wait(NULL);
wait(NULL);
}
Der Punkt ist nun aber, dass ich im parent Prozess ab und zu auf der Pipe schreiben muss, jedoch die EOF Bedingung trotzdem auslösbar bleiben muss, bedeutet also für mich ich muss nach dem schreiben p[1] schließen und vor dem schreiben wieder öffnen.
doch wie bekomm ich eine pipe wieder geöffnet?
wenn ich das mit pipe() mache, so funktioniert das doch nur wenn ich danach ein fork() benutze, oder?
Ich realisiere es jetzt mit 2 pipes pro child Prozess.
Folgendes Problem habe ich aber immernoch:
wenn ich nur einen Child Prozess verwende, klappt alles prima, nach strg-d wird beendet. habe ich 2 Child Prozesse klappt auf einmal garnichts mehr. woran liegt das?
hier der quelltext mit 1 Child(Funktionsfähig):
um das problem nochmal kurz zu schildern,
im 1. quelltext wird beim drücken von strg-d im fgets der child-prozess beendet und im parentprozess beim read() die eof-bedingung(0) ausgelöst.
sobald ich aber noch einen 2. child prozess drinnen habe, wird die eof bedingung nicht mehr ausgelöst, obwohl ich nix anderes mache als noch einen Prozess dazu-.-
Des rätsels Lösung:
Die man muss ALLE nicht benötigten Pipes schließen.
also auch die pipes, die eigentlich für nen anderen Prozess gedacht sind.
Nur wieso?!
AArgh, ich sollte mich mal anmelden.
Also ich habs jetzt alles rausgefunden:
dadurch, dass man 2 Prozesse erzeugt und beide Prozesse die Pipes der anderen mitvererbt bekommen, sind diese weiterhin geöffnet.
Im Parentprozess wird aufs schließen der pipe nicht reagiert, weil der andere Prozess diese ja noch offen hat.
Jaa, wenn der Prof sagt man soll alle schließen, dann sollte man das tun xD
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.