37 votes

Pourquoi fork() avant setsid()

Pourquoi fork() avant setsid() de daemonize un processus?

En gros, si je veux me détacher un processus à partir de son terminal de contrôle et d'en faire un processus de chef de groupe: - je utiliser setsid().

Cela sans la fourche avant ne fonctionne pas.

Pourquoi?

52voto

user175104 Points 1341

Tout d'abord: setsid() feront de votre processus un processus de chef de groupe, mais il vous fera également le chef de file d'une nouvelle session. Si vous êtes simplement intéressé par l'obtention de votre propre processus de groupe, puis utiliser setpgid(0,0).

Maintenant, pour la compréhension de la raison d'être même de setsid() renvoie EPERM si vous êtes déjà processus de chef de groupe ou chef de session, vous devez comprendre que le processus de groupe et l'id de session sont initialisées à partir de l'id de processus du processus de création (et donc conduisant, c'est à dire pour un leader de session pid == sid et pour un processus de chef de groupe pid == pgid). Aussi les groupes de processus ne peut pas se déplacer entre les sessions.

Cela signifie que si vous êtes un groupe de processus de chef de file, et la création d'une nouvelle session aura permis puis le sid et le pgid serait préparez-vous à votre pid, laissant les autres processus dans votre ancien groupe de processus dans un drôle d'état: leur processus de chef de groupe est soudainement dans une session différente, alors qu'ils pourraient eux-mêmes être. Et cela ne peut pas, d'où le EPERM par le noyau.

Maintenant, si vous fork() une fois que vous avez ni de la session, ni de groupe de processus de leader plus et par conséquent, l'installation de votre sid et pgid à votre pid est sûr, car il n'y a pas d'autres processus dans un tel groupe.

Donc, yepp, pensez à ce sujet, tout fait sens.

18voto

caf Points 114951

Il est nécessaire d' fork() et demandez à l'enfant d'appel setsid() afin de s'assurer que le processus appelant setsid() n'est-ce pas déjà un processus de chef de groupe (setsid() veut rendre le processus appelant le processus de chef de groupe d'un nouveau groupe de processus, de sorte qu'il ne parvient pas dans ce cas).

2voto

zeekvfu Points 635

man 2 setsid, vous obtiendrez la description suivante:

setsid() crée une nouvelle session si le processus appelant n'est pas un processus de chef de groupe. Le processus appelant est le chef de file de la nouvelle session, le groupe de processus de chef de file de la nouvelle procédure de groupe, et n'a pas de terminal de contrôle. Le groupe de processus ID et l'ID de session du processus appelant sont définies pour le PID du processus appelant. Le processus appelant sera le seul dans ce nouveau processus de groupe et dans cette nouvelle session.

Si un processus de chef de groupe est autorisé à appeler setsid(), de créer une nouvelle session et un nouveau groupe de processus(avec les mêmes id de groupe), il va conduire à un processus d'id de groupe de conflit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X