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.

2.6 Dæmon-Prozesse 99<br />

71–75<br />

Elternprozeß sofort nach dem erfolgreichen Aufruf. Der neue Kindprozeß hat<br />

vom System wieder eine neue, eindeutige Prozeß-ID erhalten. Der neue Prozeß<br />

ist da<strong>mit</strong> weder Anführer einer Session noch einer Prozeßgruppe <strong>und</strong> kann<br />

da<strong>mit</strong> auch kein kontrollierendes Terminal mehr erwerben.<br />

Nachdem nun die schwierigsten Aufgaben erledigt sind, gilt es noch, die unbenötigten<br />

Dateideskriptoren zu schließen. Unter normalen Umständen sind<br />

das die Deskriptoren für Standardeingabe, Standardausgabe <strong>und</strong> den Fehlerkanal.<br />

Im vorliegenden Beispiel beschränken wir uns auf diese drei, meist von<br />

der Shell bereitgestellten Dateideskriptoren. Je nach Einsatzgebiet bzw. je<br />

nach Programmaufruf kann es jedoch nötig sein, weitere Dateideskriptoren zu<br />

schließen.<br />

Beispiel 2.23. daemon.c, Teil 2<br />

48 /* Schritt 3: Assoziation zum Terminal aufbrechen */<br />

49<br />

50 if( setsid() < 0 )<br />

51 {<br />

52 syslog( LOG_ERR , "Fehler in setsid(): %s.\n",<br />

53 strerror( errno ) );<br />

54 exit( EXIT_FAILURE );<br />

55 }<br />

56<br />

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

58 {<br />

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

60 syslog( LOG_ERR , "Fehler in fork(): %s.\n",<br />

61 strerror( errno ) );<br />

62 exit( EXIT_FAILURE );<br />

63 break;<br />

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

65 break;<br />

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

67 exit( EXIT_SUCCESS );<br />

68 break;<br />

69 }<br />

70<br />

71 /* Schritt 4: Schließen unbenötigter Dateideskriptoren */<br />

72<br />

73 close( STDIN_FILENO );<br />

74 close( STDOUT_FILENO );<br />

75 close( STDERR_FILENO );<br />

76<br />

77 /* Schritt 5: Arbeitsverzeichnis wechseln */<br />

78<br />

79 chdir( "/" );<br />

80

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!