hi,
was muß ich beim proggen eines demon beachten
und wie bekomme ich ihn dazu das er sich nicht beendet und ich ihn nochmal starten muß
also das er die gleiche pid behält.
muß ich da ne endlos-schleife daraus machen
CU - Stranger
hi,
was muß ich beim proggen eines demon beachten
und wie bekomme ich ihn dazu das er sich nicht beendet und ich ihn nochmal starten muß
also das er die gleiche pid behält.
muß ich da ne endlos-schleife daraus machen
CU - Stranger
das Programm mit nohup progname starten!
Dann bleibt es im Hintergrund, ...
Aber wie du den Daemon coden mußt, kann ich dir auch nicht sagen!
Hi!
Das Grundprinzip ist eigentlich ganz einfach. Das Programm startet ja in der int main(...). Hier musst du dann ein fork() ausführen. Damit "klonst" du mehr oder weniger deinen Prozess. Den Parent beendest du (und ladest somit wieder in deiner Shell) und im Childprozess kannst du Dinge tun).
Im Rückgabewert von fork steht dann die PID des neuen Kind Prozesses drin. Im Kindprozess selber steht dann im Rückgabwert 0 drin. Somit weisst du das du im Child bist.
Ich kanns glaub ich nicht so gut erklären. Hier mal ein bisschen Code:
Ist zwar gerade alles VHIT (Vom Hirn ins Terminal), aber ich hoff ich konnte dir wenigstens ein bisschen helfen.Code:int pid; pid = fork(); if(pid == 0) { /* Alles im If-Block ist der Child Prozess */ } return(0)
Gruß
Jimmy
Ausserdem arbeitet ein Daemon in rootdirectory und bekommt ne umask(0) ... achja, und sessionführer einer neuen session wird er gewöhnlich auch Das hat dann zur Folge, dass der daemon kein Kontrollterminal hat, was ja dank syslog auch so sein kann
if((pid = fork()) == 0) {
setsid();
umask(0);
chdir("/");
}
Ist zwar alles nicht lebenswichtig aber trotzdem ganz praktisch.
soweit hab ich das alles.
nur wenn ich das return 0 drin habe beendet sich der demon.
dann habe ich den demon im code neu gestartet und er bekommt natürlich auch eine neue pid.
die linux demons beenden sich ja nicht und haben immer die gleiche pid.
muß ich da eine endlosschleife drum machen oder wie ??
z.B.
if(pid==0)
{
do
{
...Anweisung...
x=1;
}
while(x!=0);
}
return (0);
Hier ein kleiner daemon der alle 10sek. "Hallo" schreibt:
Code:int main (void) { [...] if((pid = fork()) == 0) { setsid(); chdir("/"); umask(0); for(;;) { sleep(10); printf("Hallo\n"); } /* for(;;) */ } else exit(0); } /* main */
Also soweit ich das richtig gesehen hab, bist du schon richtig.
[edit]
read below
Geändert von Baegsch (14-04-2002 um 21:49 Uhr)
Hallo Baegsch, du hast da was vergessen:
Die Zeile
if((pid = fork) == 0)
muss in
if((pid = fork()) == 0)
geändert werden da fork() eine Funktion ist.
Grüsse, Stefan
huch, na eben. Danke für den tip
Hi,
ne weitere Möglichkeit wäre die Funktion daemon():
Gruß michaCode:#include <stdio.h> #include <unistd.h> #include <errno.h> int main(void) { if(daemon(0, 0) == -1) { fprintf(stderr, "daemon(): %s\n", strerror(errno)); exit(-1); } /* do something */ return(0); }
IRC: irc.euirc.net #tux
Lesezeichen