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.

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

die traditionelle Weise asynchron von einer Signalbehandlungsfunktion verarbeiten<br />

zu lassen, behandelt ein dedizierter Thread die Signale synchron. 78<br />

Im Allgemeinen blockiert der main()-Thread dazu alle Signale, bevor er den<br />

ersten Thread startet. Die pthread_create()-Funktion vererbt die Signalmaske<br />

des aufrufenden <strong>Threads</strong> automatisch an alle neu gestarteten <strong>Threads</strong>.<br />

Da<strong>mit</strong> haben auch die neu gestarteten <strong>Threads</strong> bereits alle die gewünschten<br />

Signale in ihrer Signalmaske blockiert. Der für die Signalbehandlung vorgesehene<br />

Thread nimmt nun <strong>mit</strong> sigwait() die für den Prozeß generierten Signale<br />

an <strong>und</strong> behandelt sie nach Wunsch. Nachdem dieser Signalbehandlungsthread<br />

der einzige Thread ist, der die überall blockierten Signale annimmt, werden<br />

anhängige Signale ausschließlich von diesem Thread verarbeitet. Anders als<br />

eine asynchron gestartete Signalbehandlungsroutine unterliegt der Thread dabei<br />

keinen Einschränkungen <strong>und</strong> darf zur Behandlung der Signale auch auf<br />

Funktionen zurückgreifen, die nicht async-signal-safe sind.<br />

#include<br />

#include<br />

<br />

<br />

int pthread_sigmask( int how, const sigset_t *set,<br />

sigset_t *oset );<br />

9–11<br />

In einem Prozeß <strong>mit</strong> mehreren <strong>Threads</strong> muß zur Manipulation der Signalmaske<br />

anstelle der klassischen sigprocmask()-Funktion die Pthreads-Funktion<br />

pthread_sigmask() eingesetzt werden. pthread_sigmask() hat die gleiche<br />

Signatur wie sigprocmask(), setzt aber anstelle der Signalmaske des Prozesses<br />

lediglich die Signalmaske des aufrufenden <strong>Threads</strong>. Ansonsten ist das<br />

Verhalten der beiden Funktionen identisch (vgl. dazu Abschnitt 2.4.2). Wie<br />

bereits erwähnt, erben neue Pthreads die Signalmaske des <strong>Threads</strong>, der sie<br />

erzeugt hat.<br />

In den Beispielen 3.8 <strong>und</strong> 3.9 sehen wir ein Programm, das das Signal SIGINT<br />

<strong>mit</strong> Hilfe eines dedizierten sigwait()-<strong>Threads</strong> synchron annimmt <strong>und</strong> verarbeitet.<br />

Der Hauptthread wartet maximal 15 Sek<strong>und</strong>en lang darauf, daß<br />

dreimal in Folge über das Terminal die Abbruchtaste betätigt wird.<br />

Zunächst vereinbaren <strong>und</strong> initialisieren wir zur Synchronisation zwischen<br />

Hauptthread <strong>und</strong> sigwait()-Thread einen Zähler sig_count samt Mutex<br />

<strong>und</strong> Bedingungsvariable. In sig_count wird die Anzahl der behandelten<br />

SIGINT-Signale gezählt. Der logische Zusammenhang zwischen Daten, Mutex<br />

<strong>und</strong> Bedingungsvariable wird diesemal nicht durch eine Datenstruktur dokumentiert,<br />

sondern lediglich über das gemeinsame Präfix sig_ hervorgehoben.<br />

7 Ob Signale synchron oder asynchron behandelt werden, hängt nicht <strong>mit</strong> der Signalerzeugung<br />

zusammen. Beispielsweise können asynchron generierte Signale sowohl<br />

synchron als auch asynchron behandelt werden.<br />

8 Ein Thread, der Signale synchron verarbeitet, verrichtet diese Arbeit natürlich<br />

trotzdem asynchron zu den restlichen <strong>Threads</strong> im selben Prozeß.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!