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.3 Nebenläufige Server <strong>mit</strong> mehreren <strong>Threads</strong> 271<br />

104<br />

105 /* Signalmaske initialisieren */<br />

106 sigemptyset( &sigset );<br />

107 sigaddset( &sigset , SIGTERM );<br />

108<br />

109 /* Signalmaske für den main()-Thread setzen */<br />

110 status = pthread_sigmask( SIG_BLOCK , &sigset , NULL );<br />

111 if( status != 0 )<br />

112 {<br />

113 fprintf( stderr , "pthread_sigmask() failed: %s",<br />

114 strerror( status ) );<br />

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

116 exit( EXIT_FAILURE );<br />

117 }<br />

118<br />

119 /* Prozeß in einen Daemon umwandeln */<br />

120 daemon_init( argv[0], PIDFILE , LOG_DAEMON );<br />

121<br />

122 init_srv_stats(); /* CPU-Statistik initialisieren */<br />

123<br />

124 /* Accept -Handler starten */<br />

125 status = pthread_create( &tid, NULL, accept_handler ,<br />

126 (void *)sd );<br />

127 if( status != 0 )<br />

128 {<br />

129 syslog( LOG_ERR , "pthread_create()",<br />

130 strerror( status ) );<br />

131 exit( EXIT_FAILURE );<br />

132 }<br />

133 pthread_detach( tid );<br />

134<br />

135 sigcatcher(); /* Der Hauptthread behandelt die Signale */<br />

136<br />

137 /* Falls der Prozeß durch SIGTERM beendet wird */<br />

138 print_srv_stats(); /* CPU-Statistik ausgeben */<br />

139<br />

140 unlink( PIDFILE ); /* PID-Datei entfernen */<br />

141 exit( EXIT_SUCCESS ); /* Daemon beenden */<br />

142 }<br />

119–133<br />

135–142<br />

Nachdem sich der Prozeß in einen Dæmonprozeß gewandelt hat, wird zunächst<br />

die CPU-Statistik initialisiert. Danach wird der Accept-Handler als separater<br />

Thread gestartet <strong>und</strong> <strong>mit</strong>tels pthread_detach() entkoppelt. Der Startfunktion<br />

accept_handler() wird als einziges Argument der Socketdeskriptor des<br />

horchenden Serversockets sd übergeben.<br />

Im Anschluß übernimmt der Hauptthread, wie bereits besprochen, dediziert<br />

die Behandlung des SIGTERM-Signals. Sobald dem Prozeß ein SIGTERM zuge-

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!