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.