klappt auch ganz gut,
ich gebe einen buchstaben ein, drücke enter und dieser buchstabe wird vom anderen prozess ausgegeben.
nur sobald ich strg-d drücke, gibts bei fgets ja NULL und die pipe wird geschlossen. das müsste im anderen Prozess doch die eof bedingung beim read auslösen..tuts aber nicht. der bleibt in der schleife hängen und wartet, dass was durch die pipe kommt, was er ausgeben kann.
Ach und wenn ich in Prozess 1 pipe1[0](0 ist ja für read da?!) close, kann ich im anderen Prozess immernoch lesen. Entspricht ein close(pipe[0]) in Prozess 1 einem close[pipe[1]) in prozess 2?
Kann ich mir das bildlich so vorstellen, dass ich 2 Gartenschläuche habe:
[0]-----------[1]
[1]-----------[0]
und bei einem close() praktisch 1 Ende verstopfe, sodass der komplette Schlauch nutzlos wird?
und wie erkenn ich dann, ob die Pipe zu ist?
Im script steht:
i=read(...)
i>0 Anzahl der empfangenen Bytes
i<0 Fehler
i==EOF das Schließen der Pipe sorgt auf der Gegenseite für diese Bedingung
Jeder Childprozess hat seine eigenen Filedeskriptoren. Was in Prozess A passiert hat erstmal keine Auswirkungen auf auf Prozess B, d.h. close in A hat keine Wirkung in B.
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Zuletzt bearbeitet von knivil am 16:10:58 18.01.2012, insgesamt 2-mal bearbeitet
Mit Ctrl-D wird im Child-Prozess die Eingabe ueber stdin beendet.
Die betreffende Pipe wird geschlossen und der Child-Prozess be-
endet. Im Parent-Prozess ist entsprechend auf das Schliessen der
Pipe zu reagieren, indem von dem betreffenden Child-Prozess keine
Daten mehr angefordert werden.
Aber wie soll ich nun mitbekommen, dass die pipe zu ist?
Hmm, naja laut FAQ sollte das genauso gehen. Aber da war irgendwas ...
Ah, ja. Du testest auf EOF, aber read soll ja 0 zurueckgeben.
Zitat:
On success, the number of bytes read is returned (zero indicates end of file)
EOF ist nicht zwingend 0, sondern -1.
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Zuletzt bearbeitet von knivil am 16:31:20 18.01.2012, insgesamt 3-mal bearbeitet
Jeder Childprozess hat seine eigenen Filedeskriptoren. Was in Prozess A passiert hat erstmal keine Auswirkungen auf auf Prozess B, d.h. close in A hat keine Wirkung in B.
jmd anderes
Zitat:
Hmm, naja laut FAQ sollte das genauso gehen. Aber da war irgendwas ...
Ah, ja. Du testest auf EOF, aber read soll ja 0 zurueckgeben.
Zitat:
On success, the number of bytes read is returned (zero indicates end of file)
EOF ist nicht zwingend 0, sondern -1.
Also ich würde dem lesenden PRozess vom sendenden Prozess her mitteilen,
das game-over ist und er sich beenden kann - quasi so eine Ar
spezielle info - wenn die der lesende kriegt, macht er close und tschüß.
Der Sendende macht dann ebenfalls close und tschüß.
Geht bestimmt einfacher und eleganter - aber für mich persönlich ist
das so verständlicher
ein strcmp(eingabe,"Feierabend") liest sich halt gut...
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.