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 65<br />

$ ./quiz1<br />

Sie haben 20 Sek<strong>und</strong>en für die Antwort:<br />

Was ißt Sir Quickly am liebsten?<br />

^C<br />

Habe Signal SIGINT erhalten ...<br />

Oha: Interrupted system call ...<br />

Der Prozeß verhält sich in diesem Fall analog zum Timer-Signal aus dem<br />

vorigen Testlauf. Das Programm ist also schon ganz nahe am Sollzustand. Es<br />

gilt jedoch noch, die folgenden Probleme zu lösen:<br />

1. Wird die Abbruchtaste am Terminal gedrückt, so beendet sich das Programm.<br />

Die Anforderung war allerdings, daß sich der Prozeß durch die<br />

Abbruchtaste nicht beeinflussen läßt.<br />

Wir können das momentane Verhalten verändern, indem wir die Signalbehandlung<br />

für das Signal SIGINT auf ignorieren setzen. Wie in Beispiel 2.15<br />

zu sehen, weisen wir dazu vor dem ersten Aufruf von sigaction() dem<br />

Element sa_handler den Wert SIG_IGN zu.<br />

2. Es existiert eine sogenannte Race Condition zwischen dem Aufruf der<br />

alarm()-Funktion <strong>und</strong> dem Aufruf von fgets(). Auf einem stark ausgelasteten<br />

System könnte die Zeitschaltuhr bereits abgelaufen sein, noch<br />

bevor der Prozeß die fgets()-Funktion überhaupt aufgerufen hat. Der<br />

Anwender hätteda<strong>mit</strong>unbegrenztZeitfür seine Antwort, denn fgets()<br />

würde nicht mehr durch einen Timeout abgebrochen werden. Je größer<br />

das an alarm() übergebene Zeitintervall ist, desto unwahrscheinlicher ist<br />

zwar das Eintreten dieser Situation, nichts desto trotz wäreeinesolche<br />

Race Condition in realen Anwendungen ein echter Risikofaktor.<br />

Für unser konkretes Anliegen gibt es einen einfachen Ausweg aus dieser<br />

Falle: Die Signalbehandlungsroutine beendet den Prozeß sofort durch<br />

Aufruf von exit().<br />

Falls es in einer anderen Situation nicht möglich sein sollte, den Prozeß<br />

(oder den Thread) direkt zu beenden, stellt die alarm()-Funktion leider<br />

keine geeignete Möglichkeit dar, einen Timeout ohne Race Condition zu<br />

implementieren.<br />

Beispiel 2.15 zeigt das entsprechend der vorangehenden Analyse veränderte<br />

Quiz-Programm.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

Beispiel 2.15. quiz2.c

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!