web-dev-qa-db-fra.com

comment faire un démon de processus

J'essaie de comprendre comment puis-je faire de mon programme un démon. Donc, certaines choses que j'ai rencontrées sont En général, un programme effectue les étapes suivantes pour devenir un démon:

  1. Appelez fork( ).
  2. Dans le parent, appelez exit( ). Cela garantit que le parent d'origine (les grands-parents du démon) est convaincu que son enfant s'est terminé, que le parent du démon n'est plus en cours d'exécution et que le démon n'est pas un chef de groupe de processus. Ce dernier point est une condition préalable à la réussite de l'étape suivante.

  3. Appelez setsid( ), donnant au démon un nouveau groupe de processus et une nouvelle session, qui ont tous deux comme leader. Cela garantit également que le processus n'a pas de terminal de contrôle associé (car le processus vient de créer une nouvelle session et n'en attribuera pas).

  4. Remplacez le répertoire de travail par le répertoire racine via chdir( ). Cela est dû au fait que le répertoire de travail hérité peut se trouver n'importe où sur le système de fichiers. Les démons ont tendance à fonctionner pendant la durée de disponibilité du système, et vous ne voulez pas garder un répertoire aléatoire ouvert, et ainsi empêcher un administrateur de démonter le système de fichiers contenant ce répertoire.

  5. Fermez tous les descripteurs de fichiers.

  6. Ouvrez les descripteurs de fichiers 0, 1 et 2 (entrée standard, sortie standard et erreur standard) et redirigez-les vers /dev/null.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>

int main (void)
{
    pid_t pid;
    int i;

    /* create new process */
    pid = fork ( );  
    if (pid == -1)  
        return -1;  
    else if (pid != 0)  
        exit (EXIT_SUCCESS);  

    /* create new session and process group */  
    if (setsid ( ) == -1)  
        return -1;  

    /* set the working directory to the root directory */  
    if (chdir ("/") == -1)  
        return -1;  

    /* close all open files--NR_OPEN is overkill, but works */  
    for (i = 0; i < NR_OPEN; i++)  
        close (i);  

    /* redirect fd's 0,1,2 to /dev/null */  
    open ("/dev/null", O_RDWR);  
    /* stdin */  
    dup (0);  
    /* stdout */  
    dup (0);  
    /* stderror */  

    /* do its daemon thing... */  

    return 0;  
}

Quelqu'un peut-il me donner un lien vers le code source existant d'un programme comme Apache afin que je puisse comprendre ce processus plus en profondeur.

67
Registered User

Si vous êtes à la recherche d'une approche propre, pensez à utiliser une api- int daemon(int nochdir, int noclose); standard. Page de manuel assez simple et explicite. page de manuel . Une API bien testée dépasse largement nos propres implémentations de portabilité et de stabilité.

17
deadbeef

Sous Linux, cela peut être facilement fait en utilisant:

int main(int argc, char* argv[])
{
    daemon(0,0);
    while(1)
    {
        sleep(10)
        /*do something*/
    }

    return 0;
}
2
Alok Prasad