Pourquoi fork() avant setsid()
Pourquoi fork()
avant setsid()
à 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()
.
Le faire sans la fourche avant ne fonctionne pas.
Pourquoi?
Vous devez vous connecter pour publier un commentaire.
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.
setsid()
, créer une nouvelle session et un nouveau groupe de processus, il peut conduire à un processus d'id de groupe de conflit.Il est nécessaire de
fork()
et demandez à l'enfant d'appelersetsid()
pour s'assurer que le processus d'appelsetsid()
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 processus de groupe, donc il échoue dans ce cas).man 2 setsid
, vous obtiendrez la description suivante:Si un processus de chef de groupe est autorisé à appeler
setsid()
, 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.