Danke,
Martin
Da ich das vorgestern gelernt habe, zitiere ich jetzt mal ganz dreist ;D
"Bodo Thiesen" <bot...@gmx.de> schrieb im Newsbeitrag
news:b9k2o8$un7$1...@bodo-thiesen-server.dyndns.org...
> Das Problem ist folgendes: read blockiert solange das "Schreib-Ende" der
> Pipe offen ist, da noch Daten ankommen könnten. Lösung: Das Schreib-Ende
> schließen, sobalt der Text geschrieben wurde. Der Thread muß fd 1
> schließen, und die mutter muß fd 1 schließen, sobald der Text geschrieben
> wurde.
Grüße
Kai
Der in die Pipe schreibende Prozeß muß seinen Pipe-Schreib-Handle
schließen, sobald er alles geschrieben hat, was zu schreiben war.
Der Leser erhält dann einfach 0==read(ph[0], ...........
Dann kann der Leser close(ph[0]) machen, und der
Transfer ist beendet.
--
Mit freundlichen Grüßen
Helmut Schellong po...@schellong.de po...@schellong.com
www.schellong.de www.schellong.biz sche...@t-online.de
http://www.wikiservice.at/dse/wiki.cgi?FreeBSD
Danke,
Martin
Das kann nicht sein.
Ich hab das selbst schon oft programmiert.
> Ist doch korrekt, wenn ich das mit einer
> while(read(ph[0], buf, sizeof(buf))>0){...}
> mache, oder?
Ja.
Schließt Du auch den Lesehandle des Pipe-Schreibers
und den Schreibhandle des Pipe-Lesers jeweils sofort?
(Dürfte allerdings nichts machen, wenn nicht.)
Aja, noch was zu meinem Testprogramm: nachdem write(ph[1]...) beendet ist,
schließe ich es mit close(ph[1]). Das alleine hat bei mir aber nicht
gereicht, ich _muss_ auch direkt vor der while(read(ph[0]...)) ein
close(ph[1]), damit es in dem Beispiel funktioniert.
Ciao,
Martin
Du hast doch oben "Ja." geschrieben!
Und hier unten sagst Du close(ph[1] vor while(read
Das meine ich doch damit!
Der Vater macht sofort nach pipe() close(ph[0]),
der Child (Leser) sofort zu Anfang (im fork-{}) close(ph[1].
Ciao,
Martin
Etwas falsch verstanden haste das schon.
Eine pipe() hat doch *zwei* Kanäle.
Wenn man nur einen braucht, schließen eben beide
Parteien ihr Ende des unbenutzten Kanals.
Und das sofort - warum nicht sofort?;
spätestens, bevor die Pipe konkret durch write/read
benutzt wird (Beide Parteien gleichzeitig betrachtet).
Funktioniert das denn bei Dir jetzt uneingeschränkt?
Ciao,
Martin
Es reicht auch, wenn man es irgendwann macht, nur wenn man es nicht sofort
macht vergisst man es hinterher (zumindest laut Murphy's Gesetz).
--
Gruß, Bodo [DE: http://piology.org/ILOVEYOU-Signature-FAQ.html]
@@@@@ GEGEN TCG aka. TCPA: @@@@@ [DE: http://www.againsttcpa.com]
Wer fragt ist nur drei Minuten Dumm.
> Schließt Du auch den Lesehandle des Pipe-Schreibers
> und den Schreibhandle des Pipe-Lesers jeweils sofort?
> (Dürfte allerdings nichts machen, wenn nicht.)
Lese-Handle beim Schreibprozess ist egal. Aber das Schreib-Handle muß
*zwingend* beim Lese-Prozess geschlossen werden.
> Helmut Schellong wrote:
>> Funktioniert das denn bei Dir jetzt uneingeschränkt?
> Also ehrlich gesagt, wenn ich das close(p[1]...) unmittelbar vor dem
> (while(read(p[0]...)>0) mache, funktioniert das nicht.
Poste nochmal den Quelltext - irgendwie kommt mir das Komisch vor.
A D.h. ich muss
> direkt nach einem fork()
Hatte Helmut inzwischen schon zweimal vorgeschlagen. Ja.
> oder pipe()
Nein, wenn dann nützt Dir das andere Ende auch nichts mehr. Mindestens ein
dup (oder dup2) oder fork (oder clone) muß schon zwischen pipe und close
sein.
> das 'andere' Ende schließen.
Ciao,
Martin
Oh Mann, unser kleines haariges Sumpftröllchen pinkelt ja immer noch die
Newbies mit falschen Ratschlägen an. Diese Newsgroup ist echt verloren.
> Das meine ich doch damit!
Klar, aber sicher doch. Natürlich! Wie konnte das je jemand bezweifeln!
> Der Vater macht sofort nach pipe() close(ph[0]),
Bullshit. Nach fork, nicht nach pipe.
Eine Pipe, bei der sofort das eine Ende geschlossen wird, ist sinnlos.
Aber wem erzähle ich das. Man sieht ja, was bsh-Benutzung mit dem Hirn
anstellt (ich postuliere mal, das vorher eines da war).
> der Child (Leser) sofort zu Anfang (im fork-{}) close(ph[1].
Solange du nicht mal die rudimentäre Syntax von C-Funktionsaufrufen
hinkriegst, ist deine Anwesenheit hier nicht erwünscht.