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.

294 5 Netzwerkprogrammierung in der Praxis<br />

verschwendende Aufschrecken aller <strong>mit</strong> accept() am selben Socket wartenden<br />

Prozesse vermieden.<br />

5.6.3 Preforking im Hauptprogramm<br />

72–105<br />

107–132<br />

Der erste Teil des Hauptprogramms aus Beispiel 5.22 ist identisch <strong>mit</strong> dem<br />

nebenläufigen Server aus Beispiel 5.19. Als erstes wird der Serversocket erstellt<br />

<strong>und</strong> die Signalbehandlungsroutine initialisiert. Dann wird der Prozeß in<br />

einen Dæmon umgewandelt <strong>und</strong> schließlich werden noch die CPU-Statistiken<br />

vorbereitet.<br />

Als nächstes wird die durch NUM_PROCS bestimmte Anzahl von Serverinstanzen<br />

erzeugt. Die Prozeß-IDs der neuen Prozesse werden für den späteren Gebrauch<br />

im Feld child hinterlegt. Die Kindprozesse tauchen ihrerseits alle in<br />

die accept_handler()-Funktion ein. Die Funktion kehrt erst dann zurück,<br />

wenn dem Prozeß ein SIGTERM-Signal zugestellt wurde, worauf sich der Kindprozeß<br />

umgehend beendet.<br />

Beispiel 5.22. prefork-srv.c, Teil 3<br />

72 int main( int argc, char *argv[] )<br />

73 {<br />

74 int i, sd;<br />

75 struct sigaction action;<br />

76<br />

77 /* horchenden Socket öffnen (passive open) */<br />

78 if( ( sd = tcp_listen( NULL, SRVPORT , BACKLOG ) ) < 0 )<br />

79 exit( EXIT_FAILURE );<br />

80<br />

81 /* Signalbehandlung für SIGTERM u. SIGCHLD installieren */<br />

82 action.sa_handler = sig_handler;<br />

83 sigemptyset( &action.sa_mask );<br />

84 action.sa_flags = 0;<br />

85<br />

86 if( sigaction( SIGTERM , &action , NULL ) < 0 )<br />

87 {<br />

88 fprintf( stderr , "sigaction(SIGTERM) failed: %s",<br />

89 strerror( errno ) );<br />

90 close( sd ); /* passiven Socket schließen */<br />

91 exit( EXIT_FAILURE );<br />

92 }<br />

93<br />

94 if( sigaction( SIGCHLD , &action , NULL ) < 0 )<br />

95 {<br />

96 fprintf( stderr , "sigaction(SIGCHLD) failed: %s",<br />

97 strerror( errno ) );<br />

98 close( sd ); /* passiven Socket schließen */

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!