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.

3.3 Pthreads <strong>und</strong> <strong>Unix</strong>-Prozesse 139<br />

Darüber hinaus bietet die pthread_kill()-Funktion noch die Möglichkeit, ein<br />

Signal sig für den referenzierten Thread thread zu generieren. Man könnte<br />

ein solches Signal als zielgerichtet generiertes Signal bezeichnen. Auch in diesem<br />

Fall wird das Signal selbstverständlich direkt an den referenzierten Thread<br />

geschickt. 6 Falls die Operation erfolgreich war, liefert pthread_kill() den<br />

Rückgabewert 0. Andernfalls wurde kein Signal generiert <strong>und</strong> der zurückgelieferte<br />

Fehlercode gibt Auskunft über die Fehlerursache.<br />

#include<br />

#include<br />

<br />

<br />

int pthread_kill( pthread_t thread , int sig );<br />

Da<strong>mit</strong> ein Thread ein an ihn geschicktes Signal gezielt verarbeiten kann, besitzt<br />

jeder Thread seine eigene, threadspezifische Signalmaske. D. h. für jeden<br />

Thread kann individuell bestimmt werden, welche Signale er akzeptiert oder<br />

blockiert. Die Signalbehandlung findet dann im Kontext eines <strong>Threads</strong> statt.<br />

Im Gegensatz dazu hat aber ein Prozeß nach wie vor nur einen einzigen Satz<br />

von Signalbehandlungsroutinen. Die <strong>mit</strong> einem Signal verb<strong>und</strong>ene Aktion betrifft<br />

also immer den gesamten Prozeß. Insbesondere wird durch die Standardaktionen<br />

immer noch der ganze Prozeß beendet oder angehalten, falls<br />

ein entsprechendes Signal eintrifft. Es ist folglich auch nicht möglich, daß zwei<br />

verschiedene <strong>Threads</strong> zwei unterschiedliche Signalbehandlungsroutinen für ein<br />

Signal aktivieren, um da<strong>mit</strong> etwa unterschiedlich auf Arithmetik-Fehler reagieren<br />

zu können.<br />

Löst ein Thread z. B. einen Arithmetik-Fehler aus <strong>und</strong> hat der Thread das<br />

SIGFPE-Signal nicht blockiert, dann wird dieser Thread durch die prozeßweit<br />

festgelegte Signalbehandlungsroutine für das SIGFPE-Signal unterbrochen.<br />

Hinterlegt ein Thread eine alternative Signalbehandlungsroutine für<br />

das SIGFPE-Signal, so gilt die neue Signalbehandlung gleichzeitig auch für<br />

alle anderen <strong>Threads</strong> des Prozesses. Schlimmer noch: In Abschnitt 2.4.1 haben<br />

wir gelernt, daß beim Eintritt in eine Signalbehandlungsfunktion das zu<br />

behandelnde Signal blockiert wird. Nachdem nun jeder Thread seine eigene<br />

Signalmaske besitzt, ist das Signal nur für den gerade unterbrochenen<br />

Thread blockiert. Ein zweites SIGFPE-Signal könnte einen weiteren Thread<br />

unterbrechen <strong>und</strong> da<strong>mit</strong> wären zwei <strong>Threads</strong> zur selben Zeit in der gleichen<br />

Signalbehandlungsroutine aktiv <strong>und</strong> würden demzufolge auch um gemeinsame<br />

Ressourcen konkurrieren.<br />

Aus diesem Gr<strong>und</strong> empfiehlt sich in Pthreads-Programmen eine andere Herangehensweise<br />

an die Signalverarbeitung. Anstatt die generierten Signale auf<br />

6 Übrigens können alle Signale sowohl synchron als auch asynchron (<strong>und</strong> natürlich<br />

auch zielgerichtet) generiert werden. Die Eigenschaften synchron, asynchron <strong>und</strong><br />

zielgerichtet sind also lediglich Eigenschaften der Signalerzeugung <strong>und</strong> keine Eigenschaften<br />

des Signals als solches.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!