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 :
-
Appelez
fork( )
. -
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. -
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). -
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. -
Fermer tous les descripteurs de fichiers.
-
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.
0 votes
@Vlad J'avais vu daemon3 mais je veux comprendre à partir de la base complète.
2 votes
En rapport avec stackoverflow.com/questions/3095566/linux-daemonize
0 votes
Notez que selon leurs pages de manuel, setsid() et chdir() ne peuvent pas échouer ici, donc vous n'avez pas besoin de vérifier leurs valeurs de retour respectives.
0 votes
En plus de ce que
daemon
je supprime généralement les privilèges à certains utilisateurs et groupes en utilisantsetgid
ysetuid
. Si vous voulez voir ce quedaemon
si c'est le cas, je chercherais la source2 votes
Le message ci-dessus est presque 100% copié-collé du livre. Programmation système Linux, 2e édition - Parler directement au noyau et à la bibliothèque C por Robert Love (pages 173, 174). Ce serait bien si @RegisteredUser l'avait mentionné.
0 votes
En 2004, Devin Watson a écrit un bon article sur ce sujet : "Linux Daemon Writing HOWTO". Il a été archivé sur, au moins, deux sites : archive.org en date du 2006-06-03 y bibalex.org en date du 2006-06-03