Thread Ungepufferte Ausgabe in C (10 answers)
Opened by J-jayz-Z at 2005-07-05 00:39

murphy
 2006-05-03 08:24
#11236 #11236
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Man sollte da unterscheiden zwischen dem Caching, das der Kernel eventuell vornimmt und der Pufferung durch den stdio-Layer. Außerdem sollte man sich gut überlegen welche Funktionen man benutzt, wenn man auf Portabilität Wert legt.

* Die ganze Familie der fopen, fclose, fread, fwrite, fprintf, ... Funktionen ist ANSI-C, wohingegen die open, close, read, write, ... Funktionen nur POSIX-Standard sind.

* Verwendet man die low-level POSIX-Funktionen, so hat man natürlich keine Pufferung, verwendet man die ANSI-C stdio-Funktionen, so hat man Pufferung.

* Ob die Pufferung standardmäßig für Dateien, die mit fopen geöffnet werden, oder für stdin und stdout aktiv ist, ist systemabhängig.

* Auf jeden Fall kann man aber mittels der ANSI-C Funktionen setbuf oder setvbuf die Pufferung durch den stdio-Layer pro FILE * explizit an oder ausschalten. Das sollte auch unter Windoof funktionieren.

* fflush verhindert nicht die Pufferung, leert aber die Puffer. Nach jedem Schreibvorgang ein fflush auszuführen, die Pufferung aber zu aktivieren ist also Perls $| = 1 am ähnlichsten.

* fcntl ist eine low-level Funktion, die mit Pufferung gar nichts zu tun hat und obendrein extrem unportabel ist. Bei einigen Betriebssystemen kann man allerdings über fcntl-Aufrufe das Caching auf Kernellevel für eine Datei deaktivieren oder eine Synchronisation des Dateisystemes erzwingen.

* select hat mit der ganzen Geschichte nun wirklich nichts zu tun. Das ist nur für I/O-Multiplexing gedacht und wird noch manchmal für präzises Timing verwendet.
When C++ is your hammer, every problem looks like your thumb.

View full thread Ungepufferte Ausgabe in C