PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Demon



Stranger
18-03-2002, 00:04
hi,

was muß ich beim proggen eines demon beachten :confused:


und wie bekomme ich ihn dazu das er sich nicht beendet und ich ihn nochmal starten muß :confused:

also das er die gleiche pid behält.

muß ich da ne endlos-schleife daraus machen:confused:


CU - Stranger

MrIch
18-03-2002, 06:43
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!

Jimmy
18-03-2002, 07:42
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:




int pid;

pid = fork();

if(pid == 0)
{
/*
Alles im If-Block ist der Child Prozess
*/
}

return(0)



Ist zwar gerade alles VHIT (Vom Hirn ins Terminal), aber ich hoff ich konnte dir wenigstens ein bisschen helfen.

Gruß

Jimmy

Baegsch
18-03-2002, 14:04
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.

Stranger
18-03-2002, 16:26
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);

Baegsch
18-03-2002, 19:56
Hier ein kleiner daemon der alle 10sek. "Hallo" schreibt:








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

geronet
13-04-2002, 18:49
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

Baegsch
14-04-2002, 21:48
huch, na eben. Danke für den tip ;)

micha
14-04-2002, 22:36
Hi,

ne weitere Möglichkeit wäre die Funktion daemon():



#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);
}


Gruß micha