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.

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

56 }<br />

57<br />

58 if( strcmp( eingabe , antwort ) == 0 )<br />

59 printf( "Die Antwort ist richtig. Gratulation.\n" );<br />

60 else<br />

61 printf( "Leider falsch , richtig ist: %s", antwort );<br />

62<br />

63 exit( EXIT_SUCCESS );<br />

64 }<br />

Wir testen das Programm zunächst <strong>mit</strong> einer (nicht ganz richtigen) Antwort,<br />

die wir schnell genug über die Tastatur eingeben:<br />

$ ./quiz1<br />

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

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

Schnitzel<br />

Leider falsch, richtig ist: Himbeerjoghurt<br />

Die Ausgabe ist wie erwartet. Die Signalbehandlungsroutine wurde für beide<br />

Signale fehlerfrei installiert. Nachdem weder die Abbruchtaste am Terminal<br />

gedrückt, noch das Zeitintervall von 20 Sek<strong>und</strong>en überschritten wurde, wird<br />

die Eingabe vom Programm bearbeitet <strong>und</strong> als falsch erkannt.<br />

Als nächstes geben wir überhaupt keine Antwort ein <strong>und</strong> warten, bis die 20 Sek<strong>und</strong>en<br />

Bedenkzeit abgelaufen sind:<br />

$ ./quiz1<br />

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

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

Habe Signal SIGALRM erhalten ...<br />

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

Nach Ablauf des Zeitintervalls wird an den Prozeß tatsächlich das Signal<br />

SIGALRM ausgeliefert. Wie erwartet wird dadurch unsere Signalbehandlung<br />

aktiviert. Der Prozeß unterbricht also seine aktuelle Aufgabe (die fgets()-<br />

Funktion) <strong>und</strong> führt stattdessen den Programmcode von signal_handler()<br />

aus. Nach der Rückkehr aus signal_handler() beendet sich aber auch die<br />

Funktion fgets() <strong>mit</strong> einem Null-Zeiger als Rückgabewert <strong>und</strong> das Programm<br />

wird aus diesem Gr<strong>und</strong> vorzeitig verlassen. Der errno-Variable ist<br />

zu entnehmen, daß fgets() durch das Eintreffen eines Signals unterbrochen<br />

wurde.<br />

Als letztes versuchen wir, das Quiz-Programm durch Drücken der Abbruchtaste<br />

aus der Bahn zu bringen. Die Zeichenfolge ^C in der nachfolgenden Ausgabe<br />

steht für diese Interaktion:

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!