Quelle est la raison de l'exécution d'une double fourche lors de la création d'un démon?
Je suis en train de créer un démon en python. J'ai trouvé la question suivante, qui a quelques bonnes ressources et dans lequel je suis actuellement, mais je suis curieux de savoir pourquoi une double fourche est nécessaire. J'ai gratté autour de google, et trouvé beaucoup de ressources de déclarer que l'on est nécessaire, mais pourquoi pas.
Certains mentionner que c'est pour empêcher le démon de l'acquisition d'un terminal de contrôle. Comment serait-il le faire sans la deuxième fourche? Quelles sont les répercussions?
- stackoverflow.com/questions/10932592/why-fork-twice/...
- Une difficulté à faire un double fourche, c'est que les parents ne peuvent facilement obtenir le PID de l'enfant (le
fork()
appel renvoie l'enfant PID pour le parent, de sorte qu'il est facile d'obtenir le PID du processus fils, mais pas si facile d'obtenir le PID du petit-processus).
Vous devez vous connecter pour publier un commentaire.
En regardant le code référencé dans la question, la justification est:
De sorte qu'il est de s'assurer que le démon est re-apparenté sur init (juste au cas où le processus de coups de pied hors du démon est de longue durée), et enlève toute chance de le démon de réacquérir un contrôle de l'ats. Donc, si aucun de ces cas s'appliquent, puis une fourchette devrait être suffisant. "Unix Programmation Réseau - Stevens" a un bon article sur ce.
p=fork(); if(p) exit(); setsid()
. Dans ce cas, le parent quitte et le premier processus enfant est à nouveau apparentés. Le double-fourche magie est que nécessaire pour empêcher le démon de l'acquisition d'un ats.forks
unchild
processus, ce premier processus enfant sera unsession leader
et sera en mesure d'ouvrir un terminal TTY. Mais si j'ai de la fourche à partir de cet enfant et de mettre fin à ce premier enfant, le deuxième fourche enfant ne sera pas unsession leader
et ne sera pas en mesure d'ouvrir un terminal TTY. Est cette déclaration correcte?setsid()
. Ainsi, la première fourche processus devient un leader de session, après l'appel desetsid()
et puis nous fourche à nouveau de sorte que la finale, double-fourches processus n'est plus un animateur de la séance. Autres que l'exigence desetsid()
à être un animateur de la séance, vous êtes sur place.J'essaye de comprendre le double fourche et je suis tombé sur cette question ici. Après beaucoup de recherche, c'est ce que j'ai compris. Espérons que cela va aider à clarifier les choses le mieux pour quelqu'un qui a la même question.
Dans Unix tous les processus qui appartient à un groupe qui, à son tour, appartient à une session. Voici la hiérarchie...
Session (SID) → Groupe de Processus (PGID) → Processus (PID)
Le premier processus dans le processus de groupe devient le processus de chef de groupe et le premier dans le processus de la session devient le leader de la session. Chaque session peut avoir un numéro associé. Seulement un leader de session peut prendre le contrôle d'un ATS. Pour qu'un processus soit véritablement automatiquement (a couru dans le fond), nous devons nous assurer que le leader de la session est tué alors qu'il n'y a pas de possibilité de la session jamais prendre le contrôle de l'ATS.
J'ai couru Sander Maréchal de python exemple daemon programme de ce site sur mon Ubuntu. Voici les résultats avec mes commentaires.
De noter que le processus est le leader de la session après
Decouple#1
, parce que c'estPID = SID
. Il pourrait encore prendre le contrôle d'un ATS.Noter que
Fork#2
n'est plus le leader de la sessionPID != SID
. Ce processus ne peut jamais prendre le contrôle d'un ATS. Vraiment automatiquement.Personnellement, je trouve la terminologie de la fourchette à deux reprises pour être source de confusion. Une meilleure idiome peut-être à la fourchette découpler-fourche.
Autres liens d'intérêt:
fork()
déjà empêche de créer des zombies, à condition de fermer le parent.setsid()
avant un seulfork()
? En fait, je suppose que les réponses de cette question vous répondre.Strictement parlant, le double-fourche n'a rien à voir avec la ré-parenting le démon comme un enfant de
init
. Tout ce qui est nécessaire pour re-parent de l'enfant que le parent doit quitter. Cela peut être fait avec une seule fourche. Aussi, en faisant un double-fourche par lui-même n'a pas re-parent le processus de démon àinit
; le démon du parent doit sortie. En d'autres termes, le parent se ferme lorsque la fourche d'un bon démon, afin que le démon est re-apparenté àinit
.Alors pourquoi la double fourche? POSIX.1-2008 date de Section 11.1.3, "Le Terminal De Contrôle", a la réponse (italiques ajoutés):
Cela nous dit que si un processus démon fait quelque chose comme ça ...
... puis le démon pourrait acquérir
/dev/console
que son terminal de contrôle, selon que le démon est un leader de session, et en fonction de la mise en œuvre du système. Le programme peut garantie que l'appel ci-dessus ne seront pas acquérir un terminal de contrôle si le programme s'assure d'abord qu'il n'est pas un animateur de la séance.Normalement, lors du lancement d'un démon,
setsid
est appelé (à partir du processus enfant après l'appel defork
) de dissocier le démon de son terminal de contrôle. Toutefois, l'appel desetsid
signifie également que le processus appelant sera le leader de la session de la nouvelle session, ce qui laisse ouverte la possibilité que le démon pourrait acquérir un terminal de contrôle. Le double-fourche technique permet de s'assurer que le processus de démon n'est pas le leader de la session, ce qui garantit ensuite, un appel àopen
, comme dans l'exemple ci-dessus, n'entraînera pas dans le processus de démon de réacquérir un terminal de contrôle.La double fourche technique est un peu paranoïaque. Il peut ne pas être nécessaire si vous savoir que le démon ne jamais ouvrir un terminal de fichier. Aussi, sur certains systèmes, il peut ne pas être nécessaire, même si le démon n'ouvrez un terminal de fichier de périphérique, depuis que le comportement de la mise en œuvre est définie. Cependant, une chose qui n'est pas mise en œuvre définies est que seul un leader de session peut affecter le terminal de contrôle. Si un processus n'est pas un leader de session, il ne peut pas allouer un terminal de contrôle. Par conséquent, si vous voulez être paranoïaque et être certain que le démon ne peut pas, par inadvertance, d'acquérir un terminal de contrôle, indépendamment de toute mise en œuvre définies par les détails, puis le double-fourche technique est essentielle.
LogFile=/dev/console
. Les programmes n'ont pas toujours le temps de compilation de contrôle sur les fichiers qu'ils pourraient ouvrir 😉Prises de Mauvais CTK:
"Sur certaines saveurs de Unix, vous êtes obligé de faire un double-fourche au démarrage, afin d'entrer en mode démon. C'est parce que seule la fourche n'est pas garanti de se détacher du terminal de contrôle."
setsid
après une première fourche. Il veille ensuite à ce qu'il reste détaché à partir d'un terminal de contrôle par bifurquer à nouveau et d'avoir le leader de la session (le processus qui a appelésetsid
) de sortie.fork
qui se détache du terminal de contrôle. C'estsetsid
qui le fait. Maissetsid
échouera si elle est appelée à partir d'un processus de chef de groupe. Ainsi une premièrefork
doit être fait avantsetsid
pour s'assurer quesetsid
est appelé à partir d'un processus qui n'est pas un processus de chef de groupe. La deuxièmefork
assure que le processus final (celui qui va être le démon) n'est pas un animateur de la séance. Seuls les animateurs de la séance peut acquérir un terminal de contrôle, de sorte que cette deuxième fourche garantit que le démon ne sera pas, par inadvertance, acquérir un terminal de contrôle. Cela est vrai de toute POSIX OS.Selon "Advanced Programming in the Unix Environment", par Stephens et Rago, la deuxième fourche est plus une recommandation, et il est fait pour garantir que le démon ne pas acquérir un terminal de contrôle sur le Système V-systèmes.
Une des raisons est que le processus parent peut immédiatement wait_pid() pour l'enfant, et puis l'oublier. Lorsque le grand-enfant meurt, c'est le parent est de l'init, et il faudra attendre () - et de l'état zombie.
Le résultat est que le processus parent n'a pas besoin d'être conscient de la fourche enfants, et il rend aussi possible la fourche long processus en cours d'exécution à partir de libs etc.
Le démon() l'appel de la mère d'appel _exit() si elle réussit. La motivation initiale peut avoir été de permettre au parent de faire un travail supplémentaire alors que l'enfant est daemonizing.
Il peut également être basée sur une croyance erronée qu'il est nécessaire afin d'assurer le démon n'a pas de parent, et il est à nouveau apparentés à init - mais ce sera de toute façon une fois que le parent décède dans l'unique fourche cas.
Donc je suppose que tout cela se résume juste en bas de la tradition de la fin - une seule fourche est suffisante tant que le parent meurt en peu de temps de toute façon.
Un décent discussion à ce sujet semblent être à http://www.developerweb.net/forum/showthread.php?t=3025
Citant mlampkin à partir de là:
Il pourrait être plus facile à comprendre de cette façon: