amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > C: Stream-Pufferung [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

23.01.2007, 15:49 Uhr

Solar
Posts: 3680
Nutzer
Mal ein Problemchen aus den unergründlichen Tiefen des C-Standard.

In der Standardbibliothek kann man mit setvbuf() die Pufferung eines Streams beeinflussen. Vorgegeben sind die Modi _IONBF (keine Pufferung), _IOLBF (zeilenweise Pufferung) und _IOFBF (volle Pufferung).

Für Ausgabe macht das auch durchaus Sinn: Sofort rausschreiben, nach einem Zeilenende rausschreiben, oder rausschreiben wenn der Puffer voll ist.

Aber bei Eingabe... _IONBF und _IOFBF machen auch weiterhin Sinn, aber _IOLBF? Wie soll zeilenweiser Input funktionieren, ohne letztendlich zeichenweise und ungepuffert einzulesen und nach jedem Zeichen auf Zeilenende zu prüfen?

Meiner Meinung nach bleibt kaum etwas übrig, als beim Input _IOLBF wie _IOFBF zu behandeln, oder?

[ - Antworten - Zitieren - Direktlink - ]

24.01.2007, 02:18 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Aber bei Eingabe... _IONBF und _IOFBF machen auch weiterhin Sinn, aber _IOLBF? Wie soll zeilenweiser Input funktionieren, ohne letztendlich zeichenweise und ungepuffert einzulesen und nach jedem Zeichen auf Zeilenende zu prüfen?

Mir ist nicht klar, was Pufferung hier semantisch bedeuten soll, das kann unterschiedlich gemeint und für Eingabe und Ausgabe auch noch unterschiedlich sein.

Wenn ich einen String zur Ausgabe schicke, muss der im Modus "Zeilenweise" ja auch Zeichen für Zeichen nach einem Zeilenwechsel durchsucht werden, damit die Funktion entscheiden kann, ob sie einen nicht vollständig gefüllten Puffer an den stream weiterreicht.

So muss denn eine Lesefunktion umgekehrt im Modus "Zeilenweise" auch Zeichen für Zeichen nach einem Zeilenwechsel suchen, um zu entscheiden, ob ein nicht gefüllter Puffer an die Anwendung zurückgegeben oder noch weiter auf neue Zeichen gewartet wird.

Kann aber auch sein, dass ich die Intentionen des Autors komplett falsch interpretiere.

Man kann bestimmt auch aus Effizienzgründen, je nach tatsächlichem Gerät, dem stream implementierungsseitig einen Puffer spendieren, auf den die Anwendung gar keinen Einfluss hat. Wenn ich im Modus "Zeilenweise" aus ner Datei lese, wäre es wohl tödlich, unter der Haube tatsächlich Zeichen für Zeichen zu lesen. Bei ner Konsole dagegen kann ich mich u.U. auch auf den Zeileneingabemodus der Konsole verlassen, solange der Puffer der Anwendung groß genug für die Zeile ist. Und seriellen Input muss ich in jedem Fall in irgendeiner Form puffern, auch wenn die Anwendung zeichenweise liest, oder?

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

24.01.2007, 08:10 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Holger:

Mir ist nicht klar, was Pufferung hier semantisch bedeuten soll...


Die Pufferung, die zwischen den Standardfunktionen (fscanf() / fprintf()) und den Kernel-Funktionen (read() / write()) stattfindet.

Zitat:
Wenn ich einen String zur Ausgabe schicke, muss der im Modus "Zeilenweise" ja auch Zeichen für Zeichen nach einem Zeilenwechsel durchsucht werden, damit die Funktion entscheiden kann, ob sie einen nicht vollständig gefüllten Puffer an den stream weiterreicht.

Ja, aber das findet im Userspace statt. Würde man das beim Input machen, müßte man - trotz "zeilenweiser Pufferung" - für jedes einzelne Zeichen eine Kernel-Funktion bzw. einen Plattenzugriff auslösen...

Zitat:
So muss denn eine Lesefunktion umgekehrt im Modus "Zeilenweise" auch Zeichen für Zeichen nach einem Zeilenwechsel suchen, um zu entscheiden, ob ein nicht gefüllter Puffer an die Anwendung zurückgegeben oder noch weiter auf neue Zeichen gewartet wird.

Ich glaube, Du verstehst das falsch. Egal welche Pufferung eingestellt ist, am semantischen Verhalten z.B. von fscanf() ändert das nichts, höchstens an der Performance.

Zitat:
Und seriellen Input muss ich in jedem Fall in irgendeiner Form puffern, auch wenn die Anwendung zeichenweise liest, oder?

Erzähl' das mal Paula. Wenn ich mich richtig erinnere, war der Puffer für die eingebaute serielle Schnittstelle exakt ein Byte groß. :-)

[ - Antworten - Zitieren - Direktlink - ]

24.01.2007, 19:17 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Ja, aber das findet im Userspace statt. Würde man das beim Input machen, müßte man - trotz "zeilenweiser Pufferung" - für jedes einzelne Zeichen eine Kernel-Funktion bzw. einen Plattenzugriff auslösen...

Wenn es keine Möglichkeit gibt, diesen Modus an den Kernel, bzw. das assoziierte Gerät weiterzureichen, heißt es genau das. Also Kernelfunktion, denn ich bin mir ziemlich sicher, dass der Kernel resp. das Dateisystem selber seine eigenen Puffer verwaltet.
Zitat:
Ich glaube, Du verstehst das falsch. Egal welche Pufferung eingestellt ist, am semantischen Verhalten z.B. von fscanf() ändert das nichts, höchstens an der Performance.
Eine weitere Möglichkeit für den C-Programmierer, sich selbst in's Knie zu schießen? Ok, dann stimmt o.g. Einschätzung, zeilenweise heißt zeichenweise, wenn man so blöd ist, es für eine Kernel/Gerätekombination ohne entsprechende Unterstützung einzuschalten.

Man könnte es vielleicht auch ohne Kompatibilitätsprobleme so lösen, dass man zeilenweise lesen als vollgepuffert lesen uminterpretiert, aber das erscheint mir irgendwie zu intelligent. Wenn man nämlich an diesem Punkt angelangt ist, liegt der Schluss schon viel zu nahe, dass ein komplettes Ignorieren des Anwendungsprogrammierers an der Stelle die beste Lösung wäre.
Zitat:
Erzähl' das mal Paula. Wenn ich mich richtig erinnere, war der Puffer für die eingebaute serielle Schnittstelle exakt ein Byte groß. :-)
Paula ist keine Kernelfunktion, sondern ein Chip. Genau weil man mit diesem Chip ohne Puffern keine sinnvolle High-Level I/O hinbekommen würde, wird das serial.device (≈ Kernelfkt.) immer Puffern, egal, ob die Anwendung über ungepufferte oder gepufferte DOS-Funktionen (≈ Userfkt.) aus SER: liest.

Das hinkt etwas, weil es beim AmigaOS nicht per se in einem Overhead resultiert, wenn man Lowlevel- statt Highlevel oder "Kernel", statt "User" Funktionen aufruft.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

25.01.2007, 09:03 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Holger:

Eine weitere Möglichkeit für den C-Programmierer, sich selbst in's Knie zu schießen?


Na ja. Wenn Du zum Beispiel ein Errorlog schreibst, dann willst Du halt nicht, daß im Falle eines Absturzes die letzten Informationen noch irgendwo in einem Puffer vor sich hingammeln, und setzt den Stream auf _IONBF. Oder du willst, daß der vom Stream genutzte Puffer an einer ganz bestimmten Stelle im Speicher liegt...

Zitat:
Man könnte es vielleicht auch ohne Kompatibilitätsprobleme so lösen, dass man zeilenweise lesen als vollgepuffert lesen uminterpretiert, aber das erscheint mir irgendwie zu intelligent. Wenn man nämlich an diesem Punkt angelangt ist, liegt der Schluss schon viel zu nahe, dass ein komplettes Ignorieren des Anwendungsprogrammierers an der Stelle die beste Lösung wäre.

Naja, die Möglichkeit gäbe es im Standard wohl auch - einfach -1 zurückgeben und dem User damit signalisieren, "ist mir ziemlich egal, was Du willst"...

Ich denke aber, ich werde mich für die vollgepufferte Variante entscheiden, auch wen Du sie für "zu intelligent" hältst. ;-)

Danke jedenfalls für das Feedback.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > C: Stream-Pufferung [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.