Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DAEMON UNIX-LIKE


Information sur la source

Catégorie :Système Classé sous : demon, unix, processus, interne Niveau : Débutant Date de création : 12/01/2007 Date de mise à jour : 12/01/2007 22:53:36 Vu / téléchargé: 5 936 / 129

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Un deamon unix est un processus interne qui s'exécute en arrière-plan plutôt que sous le contrôle direct d'un utilisateur (ca permet de liberer votre SHELL)c'est l'equivalent d'un service NT sous windows .
ecrire un daemon en C est tres simple avec ses quelque fonction :

-fork
-switch
-umask
-sid
-chdir
-close(shell)
-boucle infini

cc -c daemon.c -o demon


 

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <unistd.h>
  • #include <string.h>
  • #include <errno.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>
  • #include <time.h>
  • #include <signal.h>
  • void daemonize(); // Creation du deamon
  • int main(int argc,char *argv[])
  • {
  • /**demarrage du deamon
  • */
  • daemonize();
  • /**
  • ps -aux pour verifier le pid
  • */
  • while(1) // boule infini
  • {
  • /**ceci est une GRAVE ERREUR
  • un deamon ne doit jamais intergir avec
  • l'utilsateur . il est ecrit pour executer des
  • tacher cache (hidden task) ex: service reseau ftp,web.
  • Mettez ca dans la tete ceci est un exemple
  • */
  • puts("tic..c le demon");
  • /*pur que le puts marche vous devez commenter
  • ou supprimer la fonction
  • close(STDOUT_FILENO);
  • */
  • sleep(30);
  • }
  • return EXIT_SUCCESS
  • }
  • void deamonize(void)
  • {
  • pid_t pid,sid;
  • pid=fork();
  • switch(pid) {
  • case 0:
  • //on sort de la boucle
  • break;
  • case -1: //erreur
  • exit(EXIT_FAILURE);
  • break;
  • default :
  • //process parent
  • exit(EXIT_SUCCESS);
  • }
  • /** on travaille maintenant
  • dans le processus child
  • */
  • umask(0);
  • sid=setsid();
  • if(sid<0) {
  • perror("sid");
  • exit(EXIT_FAILURE);
  • }
  • if(chdir("/")<0){
  • perror("chdir");
  • exit(EXIT_FAILURE);
  • }
  • printf("Demon demarer pid=%d\n",(int)getpid());
  • close(STDIN_FILENO); //fermer le SHELL
  • close(STDOUT_FILENO);
  • close(STDERR_FILENO);
  • }
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <signal.h>

void daemonize(); // Creation du deamon

int main(int argc,char *argv[])
{
/**demarrage du deamon
*/
daemonize();

/**
ps -aux pour verifier le pid
*/
while(1) // boule infini
{
   /**ceci est une GRAVE ERREUR
   un deamon ne doit jamais intergir avec 
   l'utilsateur . il est ecrit pour executer des
   tacher cache (hidden task) ex: service reseau ftp,web.
   Mettez ca dans la tete ceci est un exemple
*/
   puts("tic..c le demon");
/*pur que le puts marche vous devez commenter 
  ou supprimer la fonction 
        close(STDOUT_FILENO);
*/
   sleep(30);
}
return EXIT_SUCCESS
}
void deamonize(void)
{
	pid_t	pid,sid;
	pid=fork();
switch(pid) {

case 0:
//on sort de la boucle
break;

case -1: //erreur 
exit(EXIT_FAILURE);
break;

default :
//process parent
exit(EXIT_SUCCESS);
}
/** on travaille maintenant 
dans le processus child
*/
umask(0);

sid=setsid();

if(sid<0) {
perror("sid");
exit(EXIT_FAILURE);
}

if(chdir("/")<0){
perror("chdir");
exit(EXIT_FAILURE);
}
printf("Demon demarer pid=%d\n",(int)getpid());

close(STDIN_FILENO); //fermer le SHELL
close(STDOUT_FILENO);
close(STDERR_FILENO);

}

Conclusion

Marche impec sour tous les unix-like

FREEBSD FOR LIFE
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

12 janvier 2007 22:15:57 :
correction du code
12 janvier 2007 22:53:36 :
puts

Commentaires et avis

signaler à un administrateur
Commentaire de Lalee le 12/01/2007 22:22:54

Si tu faites close(STDOUT_FILENO); Comment pourrait le puts() functioner?

signaler à un administrateur
Commentaire de xtremejames183 le 12/01/2007 22:50:36

salut,
je sais  tu dois supprimer ou commenter les 3 close pour que le puts fonctionne.
c'est un example le puts ne doit jamais apparaitre dans la boule infini du demon

signaler à un administrateur
Commentaire de exar le 18/01/2007 07:13:40

Très bien ! Il y a longtemps que je cherchais ça !
Merci !

signaler à un administrateur
Commentaire de adduke le 04/02/2008 18:37:14 10/10

Magnifique  !!!

signaler à un administrateur
Commentaire de adduke le 04/02/2008 18:41:34

En dehors d'un KILL, y a t-il une façon de fermer le démon proprement ?

signaler à un administrateur
Commentaire de exar le 13/02/2008 13:24:35

A première vue, il doit y avoir moyen, mais je n'ai pas essayé... Tenvoies un signal SIGUSR1 ou SIGUSR2 et tu l'attache à un handler...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Attente de la fin d'un processus sous Unix [ par laetitiavincent ] Bonsoir tout le mondeVoilà je voudrais lancer un processus et attendre qu'il soit fini pour que le programme continue. Sous windows, ca ne me pose pas processus sous unix [ par atefensi ] Je veux vous poser quelque question sur les processus sous unixJ'ai le programme suivantMain(){ int i=0 ;If(fork()==0){i=1 ;Exit(i) ;i=2 ;}Printf("%d" fork() et ressource partagée [ par iam_myst ] Bonjour, Je voudrais créer un programme ou je souhaite partager une ressource entre un processus père et un processus fils. j'ai ma ressource déclarée variable partagé entre processus [ par facilus ] Bonjour,j'ai fais un programme en c sous unix qui consiste a creer 3 fils (avec fork) , j'ai declaré 2 variables globales leur valeurs doivent etre le communication rs232 sous unix [ par anthonycosson ] bonjour j'aimerai savoir comment envoyer et recevoir des informations avec le port rs232 sous unix, j'utilise emacs, je sais que sous visual on dois u Message windows d'arret system aux processus ? [ par mfrai02 ] (C++ MFC visual 6)   Hello !j'aimerais savoir (s'il existe) quel message windows envoie aux processus lors d'un arrêt system. J'ai rien trouvé à ce s Comunication interne [ par R4zoX ] Bonsoir, depuis quelques temps je recherche le moyen d'informer d'une situation grace a un petit programme qui serai comme une petite fenètre sur le b Redemarage processus [ par Canaillou2k5 ] Bonjour, j'ai un serveur de jeux chez moi. Et je souhairetai que quand j'envoi la commande "exit", qui le coupe, il se redemmare tout seul. Je post ic file de message, pere-fils sous unix [ par adri85 ] Bonjour,je souhaite que le processus père de mon application envoie 2 nombres entiers plus un opérande ( + - * / %) a un fils par le biais d'une file Envoyer un signal à un processus [ par Zorgg ] Bonjour, J'aurais besoin d'envoyer juste un bit de temps a autre entre deux processus sous windows. Je pensais utiliser les signaux (signal.h) Mais je


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.