05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

38 2 Programmieren <strong>mit</strong> <strong>Unix</strong>-Prozessen<br />

Rückwirkend läßt sich da<strong>mit</strong> das Verhalten von Beispiel 2.4 vollständig erklären.<br />

Solange die Standard-Ausgabe des Programms nicht auf eine Datei<br />

umgeleitet war, wurde stdout <strong>und</strong> da<strong>mit</strong> die Ausgabe <strong>mit</strong>tels printf() zeilenweise<br />

gepuffert. Der Zeilentrenner am Ende der Meldung löst da<strong>mit</strong> eine<br />

sofortige Ausgabe über das System aus. Sobald die Ausgabe aber auf eine<br />

Datei umgelenkt wird, tritt eine vollständige Pufferung von stdout in Kraft.<br />

Die direkte Ausgabe über den Systemaufruf write() kann da<strong>mit</strong> die zwar<br />

vorausgehende, dafür aber gepufferte Ausgabe <strong>mit</strong>tels printf() überholen.<br />

Mit setbuf() <strong>und</strong> setvbuf() stellen ANSI/ISO C <strong>und</strong> IEEE Std 1003.1-2001<br />

zwei Funktionen zur Verfügung, <strong>mit</strong> deren Hilfe das Pufferungsverhalten eines<br />

Datenstroms manipuliert werden kann.<br />

#include<br />

<br />

void setbuf( FILE *stream , char *buf );<br />

int setvbuf( FILE *stream , char *buf, int type,<br />

size_t size );<br />

Beide Funktionen können nur nach dem Öffnen des Datenstroms aber noch<br />

vor dem ersten Zugriff auf den geöffneten Datenstrom eingesetzt werden. Ist<br />

erst einmal eine der drei genannten Formen der Pufferung aktiv, so kann die<br />

Art der Zwischenspeicherung nicht mehr verändert werden. Beim Zugriff auf<br />

eine Datei kann also beispielsweise nicht abwechselnd <strong>mit</strong> vollständiger <strong>und</strong><br />

zeilenweiser Pufferung gearbeitet werden.<br />

Mit setbuf() können wir die Zwischenspeicherung der C-Bibliothek nur komplett<br />

aktivieren oder deaktivieren. Um die Pufferung einzuschalten, muß der<br />

übergebene Zeiger buf auf einen freien Speicherbereich in der Größe von<br />

BUFSIZ Bytes verweisen. Die Konstante BUFSIZ wird in festgelegt.<br />

In der Praxis wird von der C-Bibliothek in diesem Fall die vollständige<br />

Pufferung ausgewählt, wenngleich der Standard auch eine zeilenweise Pufferung<br />

erlauben würde. Wird ein NULL-Zeiger an setbuf() übergeben, so wird<br />

die Zwischenspeicherung von Daten abgeschaltet.<br />

Die Funktion setvbuf() erlaubt die explizite Auswahl der Pufferungsmethode<br />

<strong>und</strong> übernimmt auf Wunsch sogar die Vereinbarung des Zwischenspeichers für<br />

die Anwendung. In sind die drei Konstanten _IOFBF für vollständige<br />

Pufferung, _IOLBF für zeilenweise Pufferung <strong>und</strong> _IONBF für die Deaktivierung<br />

der Zwischenspeicherung vereinbart. Die Argumente buf <strong>und</strong> size geben<br />

die Lage des Zwischenspeichers sowie seine Größe in Bytes an. Für _IONBF werden<br />

diese Zusatzinformationen natürlich ignoriert. Wollen wir den Datenstrom<br />

puffern, so können wir das Anlegen eines entsprechenden Zwischenspeichers<br />

auch dem System überlassen, indem wir für buf einen NULL-Zeiger übergeben.<br />

Das Argument size wird dann als Empfehlung“ für die Größe dieses<br />

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!