pourquoi le chef de groupe ne peut pas créer la session sous Linux

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:

  • chef de groupe de processus appartient à la nouvelle session;
  • les autres membres du groupe de processus appartiennent à l’ancienne session.

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:

  • tous les processus de la même session partagent le même terminal de contrôle;
  • les processus de différentes sessions ne peuvent pas partager le même terminal de contrôle.

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).