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.

144 3 Programmieren <strong>mit</strong> POSIX-<strong>Threads</strong><br />

100<br />

101 if( sig_count < INTERRUPTS )<br />

102 printf( "Timeout!\n" );<br />

103 else<br />

104 printf( "Na gut, dann hören wir halt auf.\n" );<br />

105<br />

106 status = pthread_mutex_unlock( &sig_mutex );<br />

107 if( status != 0 )<br />

108 error_exit( "pthread_mutex_unlock()", status );<br />

109<br />

110 exit( 0 );<br />

111 }<br />

101–110<br />

Zum Schluß zeigt eine Kontrollausgabe an, ob, wie gewünscht, drei Mal die<br />

Abbruchtaste gedrückt wurde, oder ob zuvor die maximale Wartezeit abgelaufen<br />

ist. Diese abschließende Überprüfung der Bedingung ist wichtig, da<br />

beim Verlassen der while()-Schleife zunächst noch nicht geklärt ist, ob die<br />

Bedingung tatsächlich erfüllt wurde. In jedem Fall verläßt der Hauptthread<br />

danach wieder seinen kritischen Bereich <strong>und</strong> beendet das Programm.<br />

3.3.4 fork() <strong>und</strong> exec() in Pthreads-Programmen<br />

Wie wir in Abschnitt 2.5.2 sehen konnten, werden unter <strong>Unix</strong> <strong>mit</strong> Hilfe der<br />

fork()-Funktion neue Prozesse erzeugt. Vor der Einführung der POSIX-<br />

<strong>Threads</strong> war dies die einzige Methode, <strong>mit</strong> der ein Programm einen neuen<br />

Kontrollfluß erzeugen konnte. Für dieses Vorhaben gibt es im Wesentlichen<br />

nur zwei Gründe:<br />

1. Es soll tatsächlich ein neuer Kontrollfluß im gleichen Programm (aber im<br />

Unterschied zu Pthreads nicht im selben Prozeß) eröffnet werden. Der neue<br />

Prozeß führt dann die ihm zugedachten Aufgaben des Programms parallel<br />

zum Elternprozeß in einem neuen Prozeß aus. Ein typisches Beispiel ist<br />

ein Webserver, der mehrere K<strong>und</strong>en gleichzeitig bedienen soll.<br />

2. Der neue Kontrollfluß hat eigentlich nur die Aufgabe, ein ganz anderes<br />

Programm zu starten. In diesem Fall folgt dem Aufruf der fork()-<br />

Funktion mehr oder weniger umgehend ein exec()-Aufruf, <strong>mit</strong> dem der<br />

Prozeß sein Prozeßabbild komplett <strong>mit</strong> dem neuen Programm überlagert.<br />

Das Hauptproblem der fork()-Funktion in einem Prozeß <strong>mit</strong> mehreren<br />

<strong>Threads</strong> ist die Frage, was beim abspalten des neuen Prozesses <strong>mit</strong> den vorhandenen<br />

<strong>Threads</strong> passieren soll. Anders als in einem Prozeß <strong>mit</strong> nur einem<br />

Kontrollfluß ist hier nicht klar, welchen Gesamtzustand das Programm beim<br />

Start des neuen Prozesses gerade hat. Werden alle <strong>Threads</strong> in den neuen Prozeß<br />

übernommen, so muß der Programmierer diverse Sonderfälle behandeln,

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!