68 votes

comment faire un démon de processus

J'essaie de comprendre comment faire de mon programme un démon. Voici quelques informations que j'ai trouvées 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 permet de s'assurer que le parent d'origine (le grand-parent du démon) est satisfait de la fin de son enfant. grand-parent) est satisfait que son enfant se soit terminé, que le parent du démon ne soit plus plus en cours d'exécution, et que le démon n'est pas un leader 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, tous deux qui l'ont comme leader. Cela garantit également que le processus n'a pas de terminal de contrôle associé associé (puisque le processus vient de créer une nouvelle session, et ne va pas en assigner une). une session).

  4. Changez le répertoire de travail pour le répertoire Root via chdir( ) . Ceci est fait car le répertoire de travail hérité peut être n'importe où dans le système de fichiers. Les démons ont tendance à s'exécuter pendant toute la durée de fonctionnement du système, et vous ne voulez pas garder un répertoire ouvert au hasard, et ainsi empêcher un administrateur d'accéder au système. garder un répertoire aléatoire ouvert, et ainsi empêcher un administrateur de démonter le démonter le système de fichiers contenant ce répertoire.

  5. Fermer tous les descripteurs de fichiers.

  6. Ouvrir les descripteurs de fichiers 0, 1 et 2 (entrée standard, sortie standard et erreur standard) et les rediriger 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.

2 votes

Vous pouvez obtenir les sources d'Apache aquí .

7 votes

Peut-être démon(3) pourrait être utile. Il est dit en substance que la fonctionnalité nécessaire est déjà mise en œuvre.

0 votes

Je n'ai pas encore reçu de réponse à cette question, mais j'ai déjà reçu une réponse à cette question.

42voto

Un exemple de la façon d'écrire un démon simple est disponible dans le site Web de la Commission européenne. Guide pratique d'écriture de démons pour Linux .

23voto

deadbeef Points 276

Si vous recherchez une approche propre, envisagez d'utiliser l'api standard. int daemon(int nochdir, int noclose); . La page d'accueil est assez simple et explicite. page de manuel . Une interface utilisateur bien testée l'emporte de loin sur notre propre mise en œuvre en termes de portabilité et de stabilité.

1 votes

Je suis heureux que ce soit un responder maintenant, au lieu d'être caché dans les commentaires. Peut-être pourriez-vous l'étoffer un peu - lien vers la norme (ou encore mieux, un lien vers un tutoriel ou un exemple).

2 votes

@deadbeef Cette réponse est bien meilleure que l'ordinaire. lien seulement réponses qui étaient présents auparavant. Mais bien qu'il soit également assez proche d'un lien seulement (de toute façon, je considérerais le lien donné comme beaucoup plus stable). J'essaierais d'améliorer la réponse, en donnant un court exemple de code (surtout qu'il n'y en a pas dans la page de manuel liée), ou en citant le synopsis.

2 votes

Notez que démon La fonction est no Conforme à la norme POSIX.

2voto

knoxxs Points 1306

Vous trouverez un autre exemple à l'adresse suivante http://www.thegeekstuff.com/2012/02/c-daemon-process/

2voto

Alok Prasad Points 198

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

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

    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X