DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > C: Stream-Pufferung | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2007-01-23, 15:49 h Solar Posts: 3680 User |
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? [ - Answer - Quote - Direct link - ] |
2007-01-24, 02:18 h Holger Posts: 8116 User |
Zitat: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. [ - Answer - Quote - Direct link - ] |
2007-01-24, 08:10 h Solar Posts: 3680 User |
Zitat: Die Pufferung, die zwischen den Standardfunktionen (fscanf() / fprintf()) und den Kernel-Funktionen (read() / write()) stattfindet. Zitat: 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: 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: Erzähl' das mal Paula. Wenn ich mich richtig erinnere, war der Puffer für die eingebaute serielle Schnittstelle exakt ein Byte groß. :-) [ - Answer - Quote - Direct link - ] |
2007-01-24, 19:17 h Holger Posts: 8116 User |
Zitat: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: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: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. [ - Answer - Quote - Direct link - ] |
2007-01-25, 09:03 h Solar Posts: 3680 User |
Zitat: 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: 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. [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > C: Stream-Pufferung | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |