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.

5.5 Nebenläufige Server <strong>mit</strong> mehreren Prozessen 283<br />

13–32<br />

nach erledigter Arbeit wieder beendet, wir dem Elternprozeß ein SIGCHLD-<br />

Signal zugestellt. Der Elternprozeß muß folglich das Signal bearbeiten <strong>und</strong><br />

da<strong>mit</strong> die Aufräumarbeiten für den Kindprozeß übernehmen.<br />

Die Signalbehandlungsroutine sig_handler() aus Beispiel 5.17 kümmert sich<br />

demnach nicht nur um das SIGTERM-Signal, sondern verarbeitet auch die<br />

eintreffenden SIGCHLD-Signale: Für ein SIGTERM-Signal wird auch in diesem<br />

Beispiel die globale Variable daemon_exit auf den Wert 1 gesetzt, worauf<br />

das Hauptprogramm später <strong>mit</strong> dem Programmende reagiert. Wird der Programmfluß<br />

dagegen durch ein SIGCHLD-Signal unterprochen, so hat sich einer<br />

der Kindprozesse beendet. Die sig_handler()-Funktion entsorgt“ dann in<br />

”<br />

einer Schleife die Rückgabewerte aller beendeten Kindprozesse <strong>und</strong> sorgt da<strong>mit</strong><br />

dafür, daß der Systemkern diese Prozeßinformationen nicht mehr länger<br />

in Form von Zombie-Prozessen aufbewahren muß. Da wir nicht wirklich an<br />

den Rückgabewerten interessiert sind, übergeben wir der sigwait()-Funktion<br />

als zweites Argument einen Nullzeiger.<br />

Anders als in den threadbasierten Servervarianten erfolgt die Behandlung der<br />

Signale hier übrigens wieder in einer echten Signalbehandlungsroutine <strong>und</strong><br />

nicht in einem dedizierten Signalbehandlungsthread. Die Signalbehandlungsroutine<br />

sig_handler() wird später im Hauptprogramm <strong>mit</strong>tels sigaction()<br />

gesetzt (siehe unten).<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5 #include <br />

6 #include <br />

7 #include <br />

8 #include <br />

9 #include <br />

10<br />

11 #include "server.h"<br />

12<br />

13 int daemon_exit = 0;<br />

14<br />

15 void sig_handler( int sig )<br />

16 {<br />

17 pid_t pid;<br />

18<br />

19 switch( sig )<br />

20 {<br />

21 case SIGTERM:<br />

22 daemon_exit = 1;<br />

Beispiel 5.17. fork-srv.c, Teil 1

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!