begin process at 2012 05 27 17:53:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > PROGRAMMATION DE DÉMONS

PROGRAMMATION DE DÉMONS


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Débutant Date de création :04/09/2003 Date de mise à jour :04/09/2003 12:58:55 Vu / téléchargé :4 772 / 214

Auteur : Nebula

Ecrire un message privé
Site perso
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Déjà, pour ceux qui ne le sauraient pas, un démon à unix ce que les services sont à windows : un programme tournant en arrière-plan, le plus souvent invisibles à l'utilisateur.

J'ai réalisé celui-ci à partir de documentations anglaises trouvées sur google, mais je n'ai pas repris un des exemples expliquant comment s'interfacer avec syslogd pour gérer les logs, il suffit d'un man syslogd pour avoir assez de détails :)

Enfin, comme j'avais pas vu de sources sur ce sujet, je place celle-ci en espérant que çà serve à d'autres...

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <unistd.h>
  • #include <signal.h>
  • #include <sys/stat.h>
  • void quitter(int signal) {
  • /* libérer ici toute la mémoire allouée par le démon */
  • remove("toto.pid"); /* supprimer le fichier contenant le PID */
  • exit(EXIT_SUCCESS); /* fin du démon */
  • }
  • void executer(void) {
  • FILE* f; /* ce fichier contiendra le PID du démon */
  • f = fopen("toto.pid", "rt");
  • if (f != NULL) { /* le fichier PID existe : une instance est déjà en mémoire */
  • fclose(f);
  • fprintf(stderr, "le démon est déjà en mémoire (ou a mal été terminé)\n");
  • exit(EXIT_FAILURE);
  • }
  • f = fopen("toto.pid", "wt");
  • if (f == NULL) { /* impossible d'écrire le fichier PID */
  • fprintf(stderr, "impossible d'écrire le fichier toto.pid\n");
  • exit(EXIT_FAILURE);
  • }
  • fprintf(f, "%i", getpid()); /* on écrit le PID du démon dans le fichier (ex: httpd.pid) */
  • fclose(f); /* on ferme le fichier, dont on a plus besoin */
  • while (1) {
  • sleep(1); /* remplacer le sleep par le code du démon, return pour quitter proprement */
  • }
  • }
  • int main(void) { /* pas besoin des arguments pour cet exemple ;-) */
  • switch (fork()) { /* duplication */
  • case -1: /* échec de la duplication */
  • fprintf(stderr, "erreur avec fork\n");
  • return EXIT_FAILURE;
  • case 0: /* duplication réussie : côté fils */
  • if (setsid() == -1) { /* on tente de créer un nouveau groupe pour notre démon */
  • fprintf(stderr, "erreur avec setsid\n");
  • return EXIT_FAILURE;
  • }
  • if (signal(SIGTERM, quitter) == SIG_ERR) { /* on enregistre les signaux auquels le démon doit répondre */
  • fprintf(stderr, "erreur avec signal\n");
  • return EXIT_FAILURE;
  • }
  • chdir("/tmp/"); /* aller dans le répertoire de travail du démon */
  • umask(066); /* on modifie les permissions des fichiers créés par le démon en rw------- */
  • executer(); /* entrée dans la boucle principale du démon */
  • quitter(SIGTERM); /* quitter le démon proprement */
  • default: /* duplication réussie : côté père */
  • return EXIT_SUCCESS;
  • }
  • }
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>

void quitter(int signal) {
  /* libérer ici toute la mémoire allouée par le démon */
  remove("toto.pid"); /* supprimer le fichier contenant le PID */
  exit(EXIT_SUCCESS); /* fin du démon */
}

void executer(void) {
  FILE* f; /* ce fichier contiendra le PID du démon */
  f = fopen("toto.pid", "rt");
  if (f != NULL) { /* le fichier PID existe : une instance est déjà en mémoire */
    fclose(f);
    fprintf(stderr, "le démon est déjà en mémoire (ou a mal été terminé)\n");
    exit(EXIT_FAILURE);
  }
  f = fopen("toto.pid", "wt");
  if (f == NULL) { /* impossible d'écrire le fichier PID */
    fprintf(stderr, "impossible d'écrire le fichier toto.pid\n");
    exit(EXIT_FAILURE);
  }
  fprintf(f, "%i", getpid()); /* on écrit le PID du démon dans le fichier (ex: httpd.pid) */
  fclose(f); /* on ferme le fichier, dont on a plus besoin */
  while (1) {
    sleep(1); /* remplacer le sleep par le code du démon, return pour quitter proprement */
  }
}

int main(void) { /* pas besoin des arguments pour cet exemple ;-) */
  switch (fork()) { /* duplication */
  case -1: /* échec de la duplication */
    fprintf(stderr, "erreur avec fork\n");
    return EXIT_FAILURE;
  case 0: /* duplication réussie : côté fils */
    if (setsid() == -1) { /* on tente de créer un nouveau groupe pour notre démon */
      fprintf(stderr, "erreur avec setsid\n");
      return EXIT_FAILURE;
    }
    if (signal(SIGTERM, quitter) == SIG_ERR) { /* on enregistre les signaux auquels le démon doit répondre */
      fprintf(stderr, "erreur avec signal\n");
      return EXIT_FAILURE;
    }
    chdir("/tmp/"); /* aller dans le répertoire de travail du démon */
    umask(066); /* on modifie les permissions des fichiers créés par le démon en rw------- */
    executer(); /* entrée dans la boucle principale du démon */
    quitter(SIGTERM); /* quitter le démon proprement */
  default: /* duplication réussie : côté père */
    return EXIT_SUCCESS;
  }
}

 Conclusion

Le zip contient toto.c et Makefile. Vous pouvez :
- make clean = nettoyer les fichiers binaires
- make compile = compiler le démon (make tout court marche aussi)
- make run = exécute le démon
- make kill = terminer le démon

Pour vérifier le chargement du démon s'il n'y a pas eu d'erreurs au lancement, faites un ps -x, le démon devrait sommeiller quelque part dans la liste... Et le fichier toto.pid devrait contenir le PID correspondant au démon chargé !

Pas de bug connu, hormis la gestion un peu simpliste des instances.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • MakefileTélécharger ce fichier [Réservé aux membres club]438 octets
  • toto.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 045 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip ÉNUMÉRATION DES PROCESSUS ET DÉCHARGEMENT FORCÉ DE DLL
Source avec Zip EXÉCUTABLES SE VÉRIFIANT LORSQU'ILS SONT LANCÉS
Source avec Zip Source avec une capture RICHEDIT AVEC SUPPORT DES THÈMES XP
Source avec Zip CALCUL DE HASH MD5 (WIN32)
Source avec Zip VÉRIFIER QUE L'UTILISATEUR EST ADMINISTRATEUR

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10

Commentaires et avis

Commentaire de Steak le 06/09/2003 12:50:02

Simpa ton code mais j'ai juste une petite critique....
Pour voir si une instance du demon est deja lancé, il faut utiliser un
pipe et nom un fichier...
Utilise la fonction pipe();
...

Commentaire de Nebula le 08/09/2003 08:59:41

Merci pour l'astuce, mais comme je débute en programmation unix, je ne sais pas encore comment utiliser les pipes (enfin, dans un programme j'entend), donc si tu avais un exemple sous la main, çà serait super :p

Quand au fichier il permet surtout de faire un "kill `cat toto.pid`" sans avoir besoin de chercher le PID du démon dans la liste des process, donc je vais probablement le garder, mais je conçois que pour gérer des instances, c'est un peu ... archaïque, lol

A+

Commentaire de Nebula le 08/09/2003 09:03:14

Je précise que j'ai cherché "man pipe" sur google (je suis sous windows là...), et qu'après quelques résultats salaces, j'ai obtenu l'url http://www.linux-france.org/article/man-fr/man2/pipe-2.html dont le contenu bien qu'instructif, est succint...

Commentaire de totologik le 24/10/2003 11:33:04

Désolé pour mon manque de lucidité mais sur le coup du pipe j'ai du mal à suivre,  a quoi sert le pipe si le père se meurt?), pouvez me donner quelques explication supplémentaires? D'autre part , ce devrait bien être possible de récupérer le pid du processus sans passer par un fichier, la fonction "ps" le fait bien. Si quelqun a des infos, je suis prenneur ! A+

Commentaire de muad-dib le 04/05/2007 22:49:03

Salut ! une petite question à quoi sert le fork() ici?

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales