Hallo.
Laut Manpage read(2) liefert read als Rückgabewert 0, wenn das Ende des Files erreicht ist. Ich habe nun folgendes Problem. Wenn ich aus einem mit pipe(pipefds) geöffneten Filedeskriptor lese (pipefd[0]) kann ich am anderen Ende (pipefds[1], schreiben) machen, was ich will, ich kann read nicht dazu überreden, aus diesem Filedeskriptor 0 Zeichen auszulesen (EOF). Ein Childprozeß schreibt in pipefds[1], der Vaterprozeß liesst aus pipefd[0]; aber es kommt einfach nicht für ein EOF typischen 0-read. Das schliessen der Filedeskriptoren liefert auch kein EOF, das exit(0) im Childprozeß auch nicht. Lediglich ein mit 'socketpair' geöffneter Stream liefert bei dem Aufruf von 'shutdown' diesen 0-read, aber Unix-Sockets will ich erstmal nicht einsetzen; erstens kommt die Bash auch ohne aus (die tut ja mit pipes), und zweitens macht read bereits ein 0-read, wenn der Childprozeß noch nicht bei write angelangt ist (und das zu umgehen ist sehr aufwändig). Was macht ich falsch? Muß ich irgendwelche ioctls anwerfen?
weedy.
End of File in Pipes? *gelöst*
- weedy
- Beiträge: 585
- Registriert: 02.11.2002 21:47:49
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
End of File in Pipes? *gelöst*
Zuletzt geändert von weedy am 15.11.2004 16:29:56, insgesamt 1-mal geändert.
- devilx
- Beiträge: 734
- Registriert: 26.08.2003 22:57:20
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Filderstadt
-
Kontaktdaten:
Solange die nicht benoetigten Enden der Pipe nicht geschlossen sind wir EOF niemals zurueckgegeben werden, so weit ich weiss.
When you smile, the world smiles with you
When you fart, you stand alone
... a place full of dorkness
When you fart, you stand alone
... a place full of dorkness
- weedy
- Beiträge: 585
- Registriert: 02.11.2002 21:47:49
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
[Update]
Tatsache. Mein Denkfehler war: ich übersah: die Pipe muß in jedem Prozeß geschlossen werden. Der Childprozeß schreibt und endet mit exit; dort werden beide Pipedeskriptoren automatisch geschlossen (dort konnte ein explizites close also nichts ändern), aber ich vergaß im Vater( also im lesenden Prozeß) den Schreib-Pipedeskriptor zu schliessen. Und zwar bevor ich aus der pipe mit read lese, wo ich auch ein EOF erwarte (0-read).DevilX hat geschrieben:Solange die nicht benoetigten Enden der Pipe nicht geschlossen sind wir EOF niemals zurueckgegeben werden, so weit ich weiss.
Zur Feier des Tages nenne ich den Childprozeß ab sofort Chillprozeß.
weedy.
Glossar: 0-read: bezeichnet das EOF: ssize_t read(int fd, void *buf, size_t count); liesst aus fd 0 Zeichen in buf und gibt 0 zurück.
[Update]
Es müsse nur alle Inputstreams der Pipe geschlossen sein, dann wird ein EOF erzeugt.