Pourquoi le chef de groupe ne peut pas créer la session. mais, autre que le chef de groupe capable de créer la session?
#include #include #include main() { int pid; int ppid=getppid(); if ( setsid() < 0) perror("ERROR"); if((pid=fork()) == 0) { printf("proces1=%d %d\n",getpid(),getpgrp()); int s=getpgrp(); //setpgid(pid,pid); if (setpgid(pid,0) < 0) perror("ERROR"); printf("group after proces=%d %d\n",getpid(),getpgrp()); exit(0); } wait(0); printf("group after proces=%d %d\n",getpid(),getpgrp()); }
S’il vous plaît, expliquez.
Réponse courte
Interdire setsid()
dans un chef de groupe de processus est requirejs par POSIX:
La fonction
setsid()
doit créer une nouvelle session si le processus appelant n’est pas un chef de groupe de processus.
Il est nécessaire de s’assurer que tous les membres d’un groupe de processus sont membres de la même session .
Longue réponse
L’ID du groupe de processus est le PID du responsable du groupe de processus. L’ID de session est le PID du leader de session. Après un appel à setsid()
réussi, l’ID du groupe de processus, l’ID de session et le PID doivent être identiques.
Cependant, pour le responsable du groupe de processus, l’ID du groupe de processus est déjà égal à celui du PID. S’il pouvait appeler setsid()
, son identifiant de groupe de processus rest le même, de sorte que:
Ainsi, dans ce cas, nous avons un groupe de processus avec des membres appartenant à des sessions différentes . POSIX veut interdire cette situation.
Pourquoi?
Les groupes de processus et les sessions ont été inventés pour le contrôle des tâches. Les groupes de processus sont utilisés pour déterminer les groupes de premier plan et d’arrière-plan, afin que le groupe de premier plan reçoive des signaux du terminal.
Pour ce faire, le terminal suit son groupe de processus au premier plan et envoie un signal à ce groupe lorsqu’un événement se produit.
Mais cela suppose que tous les processus d’un groupe de processus donné partagent le même terminal de contrôle , de sorte que les signaux envoyés par le terminal soient significatifs pour eux.
Le terminal de contrôle est partagé par les règles suivantes:
Ainsi, si nous demandons à tous les membres d’un groupe de processus de partager le même terminal de contrôle , nous devons également exiger qu’ils soient membres de la même session .
Référence
Voir “Interface de programmation Linux”, Chapitre 34 (Groupes de processus, sessions et contrôle des tâches).