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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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

6–9<br />

13–17<br />

19<br />

21–27<br />

29–32<br />

ANSI C festgelegten Funktionen exit() <strong>und</strong> atexit(), enthält<br />

den Prototyp für _exit().<br />

Danach folgt die Implementierung eines eigenen Exit-Handlers. Die Aufgaben<br />

dieser benutzerdefinierten Aufräumoperationen können sehr vielfältig sein.<br />

Die vorgestellte Funktion liefert lediglich eine Ausgabe, die dokumentiert, daß<br />

der Exit-Handler aufgerufen wurde.<br />

Diese Handler-Funktion wird gleich zu Beginn der main()-Funktion <strong>mit</strong>tels<br />

atexit() zur späteren Abarbeitung registriert. Im Fehlerfall, falls also die<br />

Aufräumfunktion nicht hinterlegt werden kann, wird das Programm <strong>mit</strong> einer<br />

Fehlermeldung beendet. Der Rückgabewert EXIT_FAILURE zeigt der aufrufenden<br />

Umgebung diese Fehlersituation an.<br />

Über printf() wird der String "Irgendwie ... " ausgegeben. Die Ausgabe<br />

erscheint allerdings nicht direkt auf dem Terminal, sondern wird aufgr<strong>und</strong> des<br />

fehlenden Zeilenvorschubs von der C-Laufzeitumgebung gepuffert (vgl. dazu<br />

Abschnitt 2.2). Ob die Ausgabe überhaupt erscheint, entscheidet der weitere<br />

Programmverlauf.<br />

Werden dem Prozeß beim Start Kommandozeilen-Argumente übergeben, beendet<br />

sich der Prozeß entsprechend der Argumente vorzeitig. Ist das erste<br />

Argument die Zeichenkette exit, so beendet sich der Prozeß <strong>mit</strong> der exit()-<br />

Funktion. Wird als Argument etwas anderes übergeben (z. B. _exit), wird das<br />

Programm <strong>mit</strong> _exit() verlassen. Die unterschiedliche Semantik von exit()<br />

<strong>und</strong> _exit() entscheidet schließlich darüber, ob die bereits gepufferte Ausgabe<br />

das Terminal erreicht <strong>und</strong> ob der hinterlegte Exit-Handler ausgeführt<br />

wird.<br />

Falls keine Parameter an das Programm übergeben wurden, so wird <strong>mit</strong><br />

printf() die abschließende Ausgabe "<strong>und</strong> sowieso.\n" erzeugt. Danach beendet<br />

sich der Prozeß regulär durch ein return aus der Hauptfunktion.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

Beispiel 2.1. exit-test.c<br />

5<br />

6 void exit_handler( void )<br />

7 {<br />

8 printf( "Sir Quickly räumt auf.\n" );<br />

9 }<br />

10<br />

11 int main( int argc, char *argv[] )<br />

12 {<br />

13 if( atexit( exit_handler ) != 0 )<br />

14 {

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!