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.

5.1 Aufbau der Testumgebung 247<br />

39<br />

40 * ptr ++ = c; /* Zeichen im Puffer hinterlegen */<br />

41<br />

42 /* Bei EOF oder Zeilenumbruch: Schleife verlassen */<br />

43 if( ( br == 0 ) || ( c == ’\n’ ) )<br />

44 break;<br />

45 }<br />

46<br />

47 /* Noch gar nichts gelesen <strong>und</strong> schon EOF? */<br />

48 if( ( br == 0 ) && ( n == 1 ) )<br />

49 return( 0 ); /* EOF zurückgeben */<br />

50<br />

51 *ptr = 0; /* Ergebnis <strong>mit</strong> Nullbyte terminieren ... */<br />

52 return( n ); /* ... <strong>und</strong> Anzahl der Zeichen zurückgeben */<br />

53 }<br />

17–18<br />

23–33<br />

Die readline()-Funktion erwartet insgesamt vier Parameter, die ersten drei<br />

Parameter sind <strong>mit</strong> den Parametern der read()-Funktion identisch. Die Funktion<br />

liest eine Zeichenkette von maximal nbyte-1 Zeichen vom Dateideskriptor<br />

fildes in den Puffer buf ein <strong>und</strong> terminiert diese Zeichenkette in jedem<br />

Fall <strong>mit</strong> einem Nullbyte. Der Zeilentrenner wird ebenfalls <strong>mit</strong> in der Zeichenkette<br />

abgelegt. readline() liest weniger als nbyte-1 Zeichen, sofern zuvor<br />

ein Zeilentrenner erkannt wird. Taucht innerhalb der nbyte-1 Zeichen kein<br />

Zeilentrenner auf, so werden die bislang gelesenen nbyte-1 Zeichen als nullterminierte<br />

Zeichenkette zurückgeliefert.<br />

Der vierte Parameter help, über welchen die readline()-Funktion threadsicher<br />

gemacht wird, verlangt die Adresse eines void-Zeigers. Wird readline()<br />

für einen Dateideskriptor zum ersten Mal aufgerufen, so wird der Funktion<br />

die Adresse eines <strong>mit</strong> NULL initialisierten void-Zeigers übergeben. Die<br />

readline()-Funktion weist dem Zeiger dann die Adresse einer Datenstruktur<br />

vom Typ readline_t zu, welche bei nachfolgenden Aufrufen der readline()-<br />

Funktion für diesen Dateideskriptor wieder verwendet wird. Die Aufsicht über<br />

den Zwischenspeicher <strong>und</strong> folglich auch der Schutz vor konkurrierendem Zugriff<br />

aus verschiedenen <strong>Threads</strong> wird da<strong>mit</strong> an die aufrufende Umgebung delegiert.<br />

Sobald die Eingabe über den Dateideskriptor abgeschlossen ist, muß die<br />

Anwendung den von readline() implizit angelegten Zwischenpuffer <strong>mit</strong>tels<br />

free() wieder freigeben.<br />

Als erstes wird dem Hilfszeiger rl die Adresse der eventuell bereits in einem<br />

vorhergehenden Aufruf angelgten Hilfsstruktur zugewiesen. Wird readline()<br />

für den angegebenen Dateideskriptor zum ersten Mal aufgerufen, so hat rl<br />

nun den Wert NULL. In diesem Fall fordert die readline()-Funktion vom<br />

System Speicher für eine neue readline_t-Datenstruktur an <strong>und</strong> initialisiert<br />

dieneueStruktur.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!