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.

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

10<br />

12–18<br />

readn() <strong>und</strong> writen() eingeführt, die wir nachfolgend in leicht abgewandelter<br />

Form implementieren. Die beiden Funktionen haben die gleiche Signatur<br />

wie ihre beiden Pendants read() <strong>und</strong> write().<br />

Nach der Besprechung der beiden Hilfsfunktionen entwickeln wir eine Variante<br />

von Beispiel 2.4, um die Eigenschaften der neuen Funktionen zu beleuchten.<br />

Die Funktion readn() liest in einer Schleife solange Daten vom übergebenen<br />

Dateideskriptor fildes, bis die geforderte Anzahl von nbyte Bytes in den<br />

Puffer buf übertragen ist. Die bei nbyte startende Zählvariable n gibt die<br />

noch zu lesenden Bytes an, der Hilfszeiger ptr zeigt immer auf die nächste<br />

freie Position im Puffer.<br />

Falls während des Lesens ein Fehler auftritt, falls also der Rückgabewert von<br />

read() kleiner als Null ist, so schließt sich eine Fehlerbehandlung an. Die<br />

Situation, daß br < 0 <strong>und</strong> gleichzeitig errno == EINTR gilt, kommt nach IE-<br />

EE Std 1003.1-2001 genau dann vor, wenn read() unterbrochen wird, bevor<br />

das erste Zeichen gelesen werden konnte. Ansonsten wird im Falle einer<br />

Unterbrechung laut Standard immer die Anzahl der bislang gelesenen Bytes<br />

zurückgeliefert. In jedem Fall kehrt die Funktion readn() entweder <strong>mit</strong> der<br />

richtigen Anzahl gelesener Zeichen, oder aber <strong>mit</strong> dem Rückgabewert -1 <strong>und</strong><br />

entsprechend gesetzter errno-Variable zurück.<br />

1 #include <br />

2 #include <br />

Beispiel 2.5. readn.c<br />

3<br />

4 ssize_t readn( int fildes , void *buf, size_t nbyte )<br />

5 {<br />

6 size_t n;<br />

7 ssize_t br;<br />

8 char *ptr = buf;<br />

9<br />

10 for( n = nbyte; n > 0; n -= br, ptr += br )<br />

11 {<br />

12 if( ( br = read( fildes , ptr, n ) ) < 0 )<br />

13 {<br />

14 if( errno == EINTR ) /* Unterbrechung */<br />

15 br = 0;<br />

16 else<br />

17 return( -1 ); /* Fehler */<br />

18 }<br />

19 else if( br == 0 ) /* EOF */<br />

20 return( nbyte - n );<br />

21 }<br />

22<br />

23 return( nbyte );<br />

24 }

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!