End of File in Pipes? *gelöst*

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
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*

Beitrag von weedy » 15.11.2004 02:02:23

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.
Zuletzt geändert von weedy am 15.11.2004 16:29:56, insgesamt 1-mal geändert.

Benutzeravatar
devilx
Beiträge: 734
Registriert: 26.08.2003 22:57:20
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Filderstadt
Kontaktdaten:

Beitrag von devilx » 15.11.2004 14:03:02

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

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

[Update]

Beitrag von weedy » 15.11.2004 16:28:56

DevilX hat geschrieben:Solange die nicht benoetigten Enden der Pipe nicht geschlossen sind wir EOF niemals zurueckgegeben werden, so weit ich weiss.
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).

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.

Antworten