read() auf pipe == 0

20/05/2010 - 11:28 von Markus Wichmann | Report spam
Hi all,

ich habe hier ein gar sonderbares Problem.

Also, ich habe eine Funktion geschrieben, die die Anzahl der
Vorkommnisse eines Strings in einer Datei zàhlt.

Interface:

int zaehl(int fd, char* such);

Weil ich mich nicht mit cache-wrapping-Problemen beschàftigen wollte
(wenn ich den Inhalt der Datei blockweise verarbeite und der Suchstring
gerade über das Ende des Blocks hinausgeht), habe ich diese Funktion so
geschrieben, dass sie sich Zeichen für Zeichen durch eine Datei
arbeitet. Wenn das gefundene Zeichen dem ersten Zeichen des Suchstrings
gleicht, werden soviele Zeichen nachgeladen, wie im Suchstring noch
übrig sind, und auf Übereinstimmung verglichen.

Die Funktion tut jedenfalls was sie soll, solange ich sie mit einer
Datei füttere.

Jetzt ist das hier aber Teil einer Hausaufgabe, und da lautet die
Anforderung, dass ich die Funktion mit einer Pipe füttern soll. Um genau
zu sein, soll ich einmal forken, dann soll der Kindprozess die
Übereinstimmungen zàhlen und der Elternprozess den Kindprozess füttern.
Das kann ich ja problemlos in Blöcken machen:

while((rv = read(fd, buf, 512)))
write(pipefd[1], buf, rv);

Nun scheint aber der Aufruf

read(fd, buf, 1)

immer nur dann 1 zurückzugeben, wenn der Pipe-Buffer voll ist -- und ihn
dann vollstàndig zu leeren. Ist das wirklich so? Muss ich also mit
symmetrischen Blockgrößen arbeiten?

Tschö,
Markus
 

Lesen sie die antworten

#1 Volker Birk
20/05/2010 - 14:02 | Warnen spam
Markus Wichmann wrote:
Nun scheint aber der Aufruf
read(fd, buf, 1)
immer nur dann 1 zurückzugeben, wenn der Pipe-Buffer voll ist -- und ihn
dann vollstàndig zu leeren. Ist das wirklich so? Muss ich also mit
symmetrischen Blockgrößen arbeiten?



Versuchs doch mit fread().

Viele Grüsse,
VB.
Bitte beachten Sie auch die Rückseite dieses Schreibens!

Ähnliche fragen