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.

2.2 Ein- <strong>und</strong> Ausgabe 41<br />

#include<br />

<br />

int printf( const char *format , ... );<br />

int fprintf( FILE *stream , const char *format , ... );<br />

int sprintf( char *s, const char *format , ...);<br />

int snprintf( char *s, size_t n,<br />

const char *format , ...);<br />

Die ersten beiden Funktionen sind die bekannten Ausgabefunktionen für die<br />

Ausgabe von formatiertem Text auf die Standard-Ausgabe bzw. auf einen<br />

beliebigen Datenstrom. Bei den anderen beiden Varianten erfolgt die Ausgabe<br />

anstatt auf einen Datenstrom in das übergebene Character-Feld <strong>und</strong> die<br />

erzeugte Zeichenkette wird <strong>mit</strong> einem zusätzlichen Null-Zeichen terminiert.<br />

Bei sprintf() ist hier besondere Vorsicht geboten, denn diese Funktion erlaubt<br />

es im Gegensatz zu snprintf() nicht ohne weiteres, die Maximalzahl<br />

der auszugebenden Zeichen festzulegen. Ein Buffer-Overflow ist da<strong>mit</strong> oftmals<br />

vorprogrammiert. 5 Im Allgemeinen ist deshalb – insbesondere bei Netzwerkanwendungen<br />

– die Funktion snprintf() vorzuziehen. Bei snprintf()<br />

werden maximal n-1 Zeichen im Feld s hinterlegt, das n-te Zeichen wird vom<br />

abschließenden Null-Zeichen belegt.<br />

Die Funktionen printf(), fprintf() <strong>und</strong> sprintf() liefern als Rückgabewert<br />

die Anzahl der ausgegebenen Zeichen oder einen negativen Wert im Fehlerfall.<br />

Bei snprintf() wird dagegen nicht die Anzahl der tatsächlich im Feld<br />

s abgelegten Zeichen zurückgegeben. Die Funktion liefert vielmehr die Anzahl<br />

der Zeichen, die ausgegeben worden wären, falls der übergebene Parameter<br />

n groß genug gewesen wäre um die formatierte Zeichenkette komplett<br />

in s unterzubringen. Mit anderen Worten ist von snprintf() genau dann die<br />

komplette Ausgabe erfolgreich im Feld s abgelegt worden, wenn der zurück<br />

gelieferte Wert nicht negativ <strong>und</strong> kleiner als n ist.<br />

Sowohl bei sprintf() als auch bei snprintf() wird übrigens das zusätzliche<br />

Null-Zeichen am Ende der Zeichenkette im Rückgabewert nicht berücksichtigt.<br />

Ist ein Fehler aufgetreten, so gibt errno wie üblich Auskunft über die genauere<br />

Fehlerursache.<br />

2.2.4 Ausgabe über den Syslog-Dienst<br />

Nicht in allen Fällen kann ein Programm allerdings über die Standardeingabe<br />

<strong>und</strong> -ausgabe direkt <strong>mit</strong> einem Anwender kommunizieren. Anwendungen wie<br />

z. B. Web- oder Mail-Server laufen in aller Regel unbeaufsichtigt als Hintergr<strong>und</strong>prozesse<br />

ab. Diesen Prozessen ist in diesem Fall erst gar kein Terminal<br />

5 Bei sprintf() kann nur durch spezielle Umwandlungsangaben in der Format-<br />

Zeichenkette verhindert werden, daß die erzeugte Zeichenkette nicht länger als<br />

das Feld s ist. Beispiel: sprintf( s, "%.5s", string );

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!