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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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

28 }<br />

29 }<br />

30<br />

31 /* Schritt 2: Umwandlung in einen Hintergr<strong>und</strong>prozeß */<br />

32<br />

33 switch( pid = fork() )<br />

34 {<br />

35 case -1: /* Fehler */<br />

36 fprintf( stderr , "%s: Fehler in fork(): %s.\n",<br />

37 program , strerror( errno ) );<br />

38 exit( EXIT_FAILURE );<br />

39 break;<br />

40 case 0: /* Kindprozeß läuft weiter */<br />

41 openlog( program , LOG_PID , facility );<br />

42 break;<br />

43 default: /* Elternprozeß terminiert umgehend */<br />

44 exit( EXIT_SUCCESS );<br />

45 break;<br />

46 }<br />

33–46<br />

48–69<br />

Anschließend legt sich das Programm selbst in den Hintergr<strong>und</strong>. Dies geschieht<br />

über einen Aufruf der fork()-Funktion: Während der Kindprozeß dem weiteren<br />

Programmverlauf folgt, beendet sich der Elternprozeß umgehend. Falls<br />

das Programm von einer Shell im Vordergr<strong>und</strong> gestartet wurde, stellt diese<br />

daraufhin fest, daß sich der eben gestartete Prozeß schon wieder beendet hat.<br />

Der neue Kindprozeß läuft gleichzeitig im Hintergr<strong>und</strong> weiter. Er öffnet als erstes<br />

einen Ausgabekanal zum syslog-Dienst, um auch als Hintergr<strong>und</strong>prozeß<br />

noch Statusinformationen protokollieren zu können. Alle weiteren Ausgaben<br />

erfolgen nun über den syslog-Dienst. Der Kindprozeß erbt von seinem Elternprozeß<br />

unter anderem die Prozeßgruppen-ID <strong>und</strong> auch Session-Zugehörigkeit.<br />

Da der Kindprozeß vom System allerdings eine neue, eindeutige Prozeß-ID<br />

zugewiesen bekommt, kann der neue Prozeß kein Anführer seiner (geerbten)<br />

Prozeßgruppe sein.<br />

Im nächsten Schritt löst der Prozeß seine Assoziation zum kontrollierenden<br />

Terminal. Als erstes wird dazu über den Aufruf von setsid() eine neue Session<br />

erstellt. Der aufrufende Prozeß darf dabei kein Anführer einer Prozeßgruppe<br />

sein, was in unserem Fall bereits durch den vorausgehenden Schritt<br />

gewährleistet ist. Nach erfolgreicher Rückkehr aus dem Aufruf ist der Prozeß<br />

Anführer der neuen Session, Anführer einer neuen Prozeßgruppe <strong>und</strong> besitzt<br />

kein kontrollierendes Terminal mehr.<br />

Allerdings könnte der Prozeß in seiner Eigenschaft als Anführer einer Session<br />

wieder ein kontrollierendes Terminal erlangen. Er muß dazu lediglich ein Terminal<br />

öffnen, welches nicht das kontrollierende Terminal einer anderen Session<br />

ist. Um auch das für den weiteren Programmverlauf zu verhindern, nutzen wir<br />

ein weiteres Mal die Dienste der fork()-Funktion. Wieder beendet sich der

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!