PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage zu Codestück.



pille710
23-07-2006, 15:44
Hallo,

ich habe ein kleines Verständisproblem bei folgendem Codefetzen:


#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>

int main(void) {

pid_t pid, sid;

pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}

if (pid > 0) {
exit(EXIT_SUCCESS);
}

umask(0);

sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
}

if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
}

close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

while (1) {
sleep(30);
}
exit(EXIT_SUCCESS);
}

Ich habe das hier (http://www.linuxprofilm.com/articles/linux-daemon-howto.html) gefunden, da ich mich ein etwas mit Daemons beschäftigen wollte, und eigentlich ist mir auch alles soweit klar, bis auf die von mir rot hervorgehobene Zeile
sid = setsid();

Im verlinkten how-to steht dass der neu geforkte Prozess (ein "Kind"prozess ohne Elterprozess, wenn ich das richtig verstanden habe, da der Elternprozess beendet wird) eine neue Session ID braucht um nicht zu verwaisen. Leider ist mir jetzt die SID nicht ganz klar, wo liegt da der Unterschied zur Process ID? Fasst eine Session ID z.B. Prozessgruppen wie "Vater - Kind 1 - Kind 2 - Kind 3" zusammen? Bei meiner googlesuche bin ich leider nur auf Session IDs im Zusammenhang mit PHP gestoßen, ich denke mal das hat damit nichts zu tun. Was mich jetzt stark verwundert ist dass es für mich (augenscheinlich) keinen Unterschied macht ob ich das Programm nun mit oder ohne der sid = setsid(); Zeile starte, es beendet sich in keinem Falle und hat immer den State "S".

Sorry wenn das ganze etwas wirr klingt, mir fehlt da leider noch etwas das Verständis.
Meine konkrete Frage ist es wozu ich in diesem Codeteil die setsid(); Zeile brauche und was sich grob gesagt hinter der SID verbirgt, über einen Link wäre ich da dankbar.

Besten Dank schonmal im vorraus.

peschmae
23-07-2006, 17:47
Hab gerade mal nachgeguckt. Eine Session umfasst mehrere Prozessgruppen. Im "normalen" Betrieb ist z.B. die login-Shell der Session-Leader und sämtliche in dieser Shell gestarteten Prozesse gehören zu dieser Session.

Wie das dann mit Daemons aussieht weiss ich allerdings nicht. ;)
Auf jeden Fall bewirkt der Aufruf aber dass der Prozess nachher nicht mehr zum Terminal "gehört" in dem er gestartet wurde.

MfG Peschmä

pille710
23-07-2006, 18:49
Hab gerade mal nachgeguckt. Eine Session umfasst mehrere Prozessgruppen. Im "normalen" Betrieb ist z.B. die login-Shell der Session-Leader und sämtliche in dieser Shell gestarteten Prozesse gehören zu dieser Session.

Wie das dann mit Daemons aussieht weiss ich allerdings nicht. ;)
Auf jeden Fall bewirkt der Aufruf aber dass der Prozess nachher nicht mehr zum Terminal "gehört" in dem er gestartet wurde.

MfG Peschmä

Vielen dank, das bringt ein wenig Licht in die Sache.

Ich schaue mir nochmal genauer an wie das genau funktioniert bzw. was es damit auf sich hat und was für Nachteile durch die selbe SID von aufrufendem Terminal und Daemon entstehen. Ich melde mich dann nochmal sofern ich da neue Erkentnisse habe ;)