2010-09-16 16 views
9

Comment ajouter un démon stop, start et signaler une fonction à ce code démon?Création d'un démon avec stop, start fonctionnalité dans C

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 
#include <syslog.h> 
#include <string.h> 

int main(void) { 

     /* Our process ID and Session ID */ 
     pid_t pid, sid; 

     /* Fork off the parent process */ 
     pid = fork(); 
     if (pid < 0) { 
       exit(EXIT_FAILURE); 
     } 
     /* If we got a good PID, then 
      we can exit the parent process. */ 
     if (pid > 0) { 
       exit(EXIT_SUCCESS); 
     } 

     /* Change the file mode mask */ 
     umask(0); 

     /* Open any logs here */   

     /* Create a new SID for the child process */ 
     sid = setsid(); 
     if (sid < 0) { 
       /* Log the failure */ 
       exit(EXIT_FAILURE); 
     } 



     /* Change the current working directory */ 
     if ((chdir("/")) < 0) { 
       /* Log the failure */ 
       exit(EXIT_FAILURE); 
     } 

     /* Close out the standard file descriptors */ 
     close(STDIN_FILENO); 
     close(STDOUT_FILENO); 
     close(STDERR_FILENO); 

     /* Daemon-specific initialization goes here */ 

     /* The Big Loop */ 
     while (1) { 
      /* Do some task here ... */ 

      sleep(30); /* wait 30 seconds */ 
     } 
    exit(EXIT_SUCCESS); 
} 

Répondre

6
  1. Ecrivez le pid du démon /var/run/mydaemonname.pid de sorte que vous pouvez facilement rechercher plus tard le pid.
  2. Configurer un gestionnaire de signaux pour SIGUSR1 et SIGUSR2.
  3. Lorsque vous obtenez SIGUSR1, basculez un indicateur d'arrêt.
  4. Lorsque vous obtenez SIGUSR2, définissez un indicateur de rapport.
  5. Dans votre boucle while, vérifiez chaque drapeau.
  6. Si le drapeau d'arrêt est activé, arrêtez jusqu'à ce qu'il soit effacé.
  7. Si le drapeau de rapport qu'il a défini, effacez le drapeau et faites votre rapport.

Il y a quelques complications autour de l'arrêt/démarrage, mais si je comprends bien la question, cela devrait vous mettre sur la bonne voie.

Modifier: Ajout du fichier pid comme suggéré par Dummy00001 dans un commentaire ci-dessous.

+0

Vous pourriez également mentionner la création d'un fichier pid - de sorte que le pid serait connu sans deviner. – Dummy00001

+0

@ Dummy00001 - Bon appel, merci. – bstpierre

5

D'abord, vous n'avez probablement pas faire beaucoup fork et la maison vous garder: http://linux.die.net/man/3/daemon

Ensuite, rappelez-vous que l'interface de votre démon au monde est probablement par une sorte de script shell que vous écrivez également situé dans /etc/init.d ou n'importe quel autre endroit défini par distro. Donc pour la réponse ci-dessus, votre script shell enverrait ces signaux au pid du processus. Il y a probablement un meilleur moyen cependant. Signalisation comme ci-dessus est un processus à sens unique, votre script de contrôle doit sauter à travers les cerceaux de condition de course-sujettes et fragiles afin de confirmer si le démon s'est arrêté avec succès ou a redémarré. Je chercherais la précédence et les exemples dans /etc/init.d.