Hallo,
ich habe mit mknod name p einen fifo angelegt. Ich kann diesen auch mit
fopen öffnen und mit fread bzw. read lesen. Die Leseoperation blockiert
auch ein mal.
Sobald ich aber einmal etwas in den Fifo reinpipe, wird die blockierung
dauerhaft aufgehoben. Eigentlich sollte doch der Inhalt nur einmal
auslesbar sein. Der Inhalt wurde also nicht "gelöscht". Wie muss ich das
jetzt lösen? Gibt es ein fpops?
Stefan Helmert schrieb:> Hallo,>> ich habe mit mknod name p einen fifo angelegt. Ich kann diesen auch mit> fopen öffnen und mit fread bzw. read lesen. Die Leseoperation blockiert> auch ein mal.>> Sobald ich aber einmal etwas in den Fifo reinpipe, wird die blockierung> dauerhaft aufgehoben.
Wie das? Was passiert denn, wenn du nichts mehr reinsteckst?
> Eigentlich sollte doch der Inhalt nur einmal auslesbar sein.
Ja. Kommt bei dir denn irgendwas mehrfach?
> Der Inhalt wurde also nicht "gelöscht".
Wurde er nicht?
Rolf Magnus schrieb:> Ja. Kommt bei dir denn irgendwas mehrfach?
Ja, der gesamte Inhalt. Es geht immer wieder ganz von vorne los. Mit
jeder fread-Operation liest er er den gesamten Inhalt wieder von vorne.
nein, das fread scheitert, du merkst es aber nicht und gibst immer
wieder das aus, was vom ersten Lesen noch im Puffer steht.
Ändere doch mal den Puffer nach dem ersten Lesen, und du wirst sehen,
daß beim zweiten Lesen nicht mehr der alte Inhalt wieder gelesen wird.
Man könnte auch mal den Rückgabewert vom fread anschauen...
genau genommen schlägt es ja auch nicht fehl, sondern liefert
erfolgreich 0 Zeichen :-)
Du wirst schon den Rückgabewert deiner Funktion anschauen müssen.
Evtl. kann man beim direkten Lesen mit read etwas drehen, aber bei fread
fällt mir nichts ein.
Warum nimmst du überhaupt die Streamfunktionen, wenn du eh Blöcke lesen
willst?
Mit den low level-Funktionen hat man z.B. select zum Testen, ob etwas da
ist.
So, der Code, den ich schon gepostet habe, funktioniert jetzt. Ich hatte
einige geändert und nun wieder diesen ursprünglichen Zustand
hergestellt. Ich glaube der Compiler hat sich jetzt an meinem
"Programmierstil" gewöhnt.
Klaus Wachtler schrieb:> genau genommen schlägt es ja auch nicht fehl, sondern liefert> erfolgreich 0 Zeichen :-)
Es liefert dann 0, wenn man am Ende des Files angekommen ist und dann
nochmal versucht zu lesen. Das Fileende kommt bei einem FIFO dann, wenn
die Gegenseite ihn schließt.
> Du wirst schon den Rückgabewert deiner Funktion anschauen müssen.>> Evtl. kann man beim direkten Lesen mit read etwas drehen, aber bei fread> fällt mir nichts ein.
Man könnte feof() verwenden, aber das wäre unsinnig, nur um sich das
Auswerten des Rückgabewerts von fread() zu sparen.
Stefan Helmert schrieb:> Ja, das zweite Lesen schlägt fehl, soll es aber nicht. Es soll erneut> blockieren statt fehlschlagen.
Fehlschlagen tut es nur dann, wenn ein Fehler aufgetreten ist oder die
Gegenseite den FIFO geschlossen hat. Praktischerweise kann man sich eine
textuelle Beschreibung des Fehlers mit perror() ausgeben lassen.
Stefan Helmert schrieb:> Ich glaube der Compiler hat sich jetzt an meinem> "Programmierstil" gewöhnt.
Ich installiere in solchen Fällen immer den DwIm Compiler.
DwIm = Do what I mean.
Stefan Helmert schrieb:> Kann es sein, dass nicht das fread blockiert, sondern das fopen?
Ja, falls das FIFO noch keine Gegenstelle hat und im blockierenden Modus
geöffnet wird, was mit stdio-Funktionen sowieso nicht anders möglich
ist.
Das alles ist dokumentiert: "man fifo" und "man 7 pipe".