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.

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

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

38 error_exit( "pthread_mutex_lock()", status );<br />

39<br />

40 sig_count++; /* Signal zählen <strong>und</strong> Änderung melden */<br />

41<br />

42 status = pthread_cond_signal( &sig_cond );<br />

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

44 error_exit( "pthread_cond_signal()", status );<br />

45<br />

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

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

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

49 }<br />

50 }<br />

51 }<br />

32–49<br />

60–67<br />

69–77<br />

79–98<br />

Sobald ein Signal eingetroffen ist, kehrt die sigwait()-Funktion zurück. Sofern<br />

es sich um das erwartete SIGINT-Signal handelt, tritt der Signalbehandlungsthread<br />

in seinen kritischen Bereich ein <strong>und</strong> inkrementiert den Signalzähler<br />

sig_count. Die Aktualisierung des Zählers wird dem Hauptthread<br />

über pthread_cond_signal() <strong>mit</strong>geteilt. Abschließend wird der kritische Bereich<br />

wieder verlassen <strong>und</strong> der Thread wartet auf das nächste Signal.<br />

Auch im Hauptthread wird zunächst eine geeignete Signalmaske für das<br />

SIGINT-Signal erstellt. Durch dem Aufruf von pthread_sigmask() wird dieses<br />

Signal für den main()-Thread blockiert.<br />

Erst danach wird der sigwait()-Thread gestartet. Der neue Thread erbt da<strong>mit</strong><br />

die Signalmaske seines Erzeugers <strong>und</strong> hat das SIGINT-Signal so<strong>mit</strong> ebenfalls<br />

blockiert. Er ist der einzige Thread im Prozeß, der das überall blockierte<br />

SIGINT-Signal synchron behandelt. Nachdem der sigwait()-Thread nicht<br />

aus seiner Endlosschleife ausbrechen kann <strong>und</strong> sich so<strong>mit</strong> auch nicht beendet,<br />

entkoppeln wir den Thread <strong>mit</strong> pthread_detach().<br />

Jetzt berechnen wir die Endzeit des beabsichtigten 15-sekündigen Timeouts<br />

<strong>und</strong> geben auf dem Bildschirm eine Aufforderung zur Betätigung der Abbruchtaste<br />

aus. Danach betritt der Hauptthread seinen kritischen Bereich,<br />

in dem er <strong>mit</strong> Hilfe der Bedingungsvariablen sig_cond darauf wartet, daß<br />

der Anwender drei Mal innerhalb von 15 Sek<strong>und</strong>en die Abbruchtaste betätigt<br />

hat. Während pthread_cond_timedwait() auf das Eintreten der Bedingung<br />

(oder einen Timeout) wartet, verläßt der Thread implizit seinen kritischen<br />

Bereich. Sofern die Bedingung erfüllt ist, oder pthread_cond_timedwait()<br />

durch einen Timeout unterbrochen wurde (Zeile 95), wird die while()-Schleife<br />

wieder verlassen.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!