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.

2.4 Signale 59<br />

(engl.: pending). Wie lange dieser Zustand andauert, kann von einer Anwendung<br />

normalerweise nicht festgestellt werden. Allerdings kann ein Prozeß bestimmte<br />

Signale explizit blockieren <strong>und</strong> da<strong>mit</strong> die Zustellung für einen definierbaren<br />

Zeitraum aussetzen. Signale durchlaufen also einen Lebenszyklus.<br />

Sie werden zunächst erzeugt <strong>und</strong> sind dann so lange anhängig, bis sie an einen<br />

Prozeß ausgeliefert oder von einem Prozeß angenommen werden.<br />

Die auf den ersten Blick etwas gewöhnungsbedürftige Unterscheidung zwischen<br />

den Zuständen angenommen <strong>und</strong> ausgeliefert ist ein Hinweis auf die<br />

Aktivität bzw. Passivität des Ziels. Wird ein Signal ausgeliefert, so bedeutet<br />

dies, daß der Prozeß, für den das Signal bestimmt war, das Signal nicht explizit<br />

erwartet hat. Der Prozeß war vielmehr <strong>mit</strong> einer anderen Aufgabe beschäftigt<br />

<strong>und</strong> muß diese nun ggf. zur Behandlung des Signals unterbrechen. Das Signal<br />

trifft da<strong>mit</strong> asynchron zum momentanen Programmfluß ein. Im anderen Fall<br />

ist der Prozeß dagegen aktiv <strong>und</strong> wartet über die sigwait()-Funktion auf<br />

das Eintreffen eines Signals. Das Signal wird so<strong>mit</strong> synchron zum aktuellen<br />

Programmfluß angenommen.<br />

Ältere Versionen des POSIX-Standards treffen diese genaue Unterscheidung<br />

noch nicht, dort wurde allgemein von der Auslieferung eines Signals gesprochen.<br />

Dies führte allerdings immer wieder zu Mißverständnissen bei der Auslegung<br />

des Standards, weshalb man sich in IEEE Std 1003.1-2001 auf die neue,<br />

präzisere Sprechweise geeinigt hat.<br />

2.4.1 Signale behandeln<br />

Ein ausgeliefertes Signal kann von einem Prozeß auf drei verschiedene Arten<br />

behandelt werden:<br />

• Die Standard-Signalbehandlung wird angestoßen.<br />

• Es wird eine eigene Routine zur Signalbehandlung ausgeführt.<br />

• Das Signal wird ignoriert.<br />

Über die sigaction()-Funktion kann festgelegt (<strong>und</strong> festgestellt) werden,<br />

welche Aktion eingeleitet wird, falls ein bestimmtes Signal für den aktuellen<br />

Prozeß eintrifft:<br />

#include<br />

<br />

int sigaction( int sig, const struct sigaction *act,<br />

struct sigaction *oact );<br />

Der Parameter sig legt fest, auf welches Signal sich sigaction() bezieht.<br />

Die vom Betriebssystem unterstützten Signale sind in definiert.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!