Qu'est ce qu'un processus démon ?

Des processus qui tournent en arrière plan pour faire tourner vos services.

Lorsque vous entendrez parler de démons dans le milieu de l'informatique, sachez qu'il s'agit d'un type de processus.

Les démons (plus couramment écrit en anglais daemon) sont bien connus comme étant des processus s'exécutant en arrière plan.

Dans un sens un peu plus technique, on appelle démon tout processus dont le processus père possède l'identifiant (pid) 1. Dans la majorité des cas, sur un système UNIX, le processus n°1 est "init".

Un truc bon à savoir sur les processus : si vous tuez le père d'un processus créé par un fork, il sera directement rattaché au processus n°1. La manière la plus courante de créer un démon est donc tout simplement de tuer le père du processus.

Je pense qu'un cas concret s'impose : nous allons coder en langage C un démon qui ne servira absolument à rien (drôle d'idée quand même). Nous aurons besoin :

  • D'un programme qui se clone lui-même. Notre programme deviendra le père d'une autre version de lui-même. C'est exactement ce que permet de faire la fonction fork().
  • De savoir si nous nous trouvons dans le père ou le fils. Par chance la fonction fork renvoie le pid du fils si l'on se trouve dans le père, 0 sinon.
  • Une boucle infinie, vide, qui permet au programme de ne jamais se terminer. Rappelons le, la fonction principale de notre programme est de ne servir à rien.

Création d'un démon en langage C

/* Clonage du processus courant. */ int pid = fork(); /* Si le pid est negatif, il y a une erreur. */ if (pid < 0) { perror("Echec lors du clonage."); exit(-1); } else if (pid > 0) { /* Si le pid est positif, il contient le pid du fils, ** nous sommes donc dans le père. ** On le tue ! monde cruel. */ exit(0); } /* ** Tous le reste du code ne sera exécuté que dans le processus fils, ** autrement dit notre démon :D. */ while(1);

Et voilà, vous savez ce qu'est un démon ! Sous linux vous trouverez une liste de la majorité des démons disponibles dans le dossier /etc/init.d.