Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Demon

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.05.2001
    Beiträge
    43

    Demon

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    21.10.2000
    Ort
    Deutschland
    Beiträge
    64
    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!

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.04.1999
    Ort
    Ulm
    Beiträge
    33
    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:

    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

  4. #4
    Registrierter Benutzer
    Registriert seit
    12.12.2001
    Ort
    Ortrand
    Beiträge
    8
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    26.05.2001
    Beiträge
    43
    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);

  6. #6
    Registrierter Benutzer
    Registriert seit
    12.12.2001
    Ort
    Ortrand
    Beiträge
    8
    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)

  7. #7
    Moderator Avatar von geronet
    Registriert seit
    23.05.2001
    Ort
    Grainau
    Beiträge
    96
    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

  8. #8
    Registrierter Benutzer
    Registriert seit
    12.12.2001
    Ort
    Ortrand
    Beiträge
    8
    huch, na eben. Danke für den tip

  9. #9
    Registrierter Benutzer
    Registriert seit
    25.12.1999
    Ort
    Stuttgart
    Beiträge
    259
    Hi,

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

    Code:
    #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
    IRC: irc.euirc.net #tux

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •