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.

62 2 Programmieren <strong>mit</strong> <strong>Unix</strong>-Prozessen<br />

• Wird ein Prozeß fortgesetzt, so wird der Programmfluß an der Stelle wieder<br />

aufgenommen, an der er zuvor angehalten wurde. Trifft das Signal SIGCONT<br />

auf einen laufenden Prozeß, so wird das Signal ignoriert.<br />

• Steht die Standard-Signalbehandlung auf ignorieren, so wird das zugehörige<br />

Signal bei der Zustellung ignoriert, d. h. vom Prozeß verworfen.<br />

8–21<br />

29–31<br />

33–45<br />

47–50<br />

52–63<br />

Um die Behandlung von Signalen zu veranschaulichen, entwickeln wir ein<br />

kleines Quiz-Programm. Das Programm stellt zunächst eine Frage <strong>und</strong> wartet<br />

danach auf eine Antwort, die über das Terminal eingegeben werden soll. Das<br />

Programm darf vom Terminal aus werder abgebrochen werden können, noch<br />

darf der Quiz-Teilnehmer unbegrenzt Zeit zur Antwort erhalten.<br />

Beispiel 2.14 ist der erste Versuch, der, wie wir gleich sehen werden, noch<br />

einige kleinere Schwächen aufweist.<br />

Die Funktion signal_handler() dient der Behandlung der eingehenden Signale.<br />

Zu Informationszwecken gibt die Funktion das zugestellte Signal im<br />

Klartext aus, wir können auf diese Weise schnell erkennen, ob die vom Prozeß<br />

installierten Aktionen auch tatsächlich ausgeführt werden.<br />

Im Hauptprogramm wird zunächst die sigaction-Struktur initialisiert. Als<br />

Signalbehandlung soll die Funktion signal_handler() dienen. Die Menge<br />

der während der Signalbehandlung zusätzlich zu blockierenden Signale ist<br />

leer. Außerdem wünschen wir keine besonderen Signaleigenschaften.<br />

Jetzt kann für die beiden Signale SIGINT (Abbruchtaste am Terminal gedrückt)<br />

<strong>und</strong> SIGALRM (Timer abgelaufen) die vorbereitete Signalbehandlung<br />

installiert werden. Falls der Aufruf von sigaction() fehlschlägt, wird das<br />

Programm <strong>mit</strong> einem entsprechenden Hinweis vorzeitig beendet.<br />

Als nächstes schreibt das Programm die Quizfrage auf den Bildschirm <strong>und</strong><br />

stellt <strong>mit</strong> der alarm()-Funktion eine prozeßinterne Zeitschaltuhr auf 20 Sek<strong>und</strong>en.<br />

Dies bewirkt, daß dem Prozeß nach Ablauf dieses Zeitintervalls das<br />

Signal SIGALRM zugestellt wird. Die alarm()-Funktion wird in Abschnitt 2.4.4<br />

noch genauer besprochen.<br />

Anschließend lesen wir die Antwort auf die Quizfrage ein. Sollte die fgets()-<br />

Funktion fehlschlagen, so protokollieren wir dies <strong>mit</strong> einer Fehlermeldung <strong>und</strong><br />

beenden den Prozeß. Andernfalls wird die Eingabe <strong>mit</strong> der richtigen Antwort<br />

verglichen <strong>und</strong> das Resultat ausgegeben.<br />

Beispiel 2.14. quiz1.c<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5 #include <br />

6 #include

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!